【问题标题】:ToolStripMenuItem: Cross-thread operation not valid: Control accessed from a thread other than the thread it was created onToolStripMenuItem:跨线程操作无效:控件从创建它的线程以外的线程访问
【发布时间】:2017-04-21 16:24:24
【问题描述】:

我从开发环境中创建了一个多级 ToolStripMenuItem 堆栈。

问题: 1)代码(下)用于预设工具条项的值。有两个 ToolStripMenuitems 的 myItem.GetCurrentParent().InvokeRequired 不等于 this.InvokeRequired。 GetCurrentParent.InvokeRequired 产生正确的结果一项,this.InvokeRequired 适用于另一项。所有其他项目都可以在任何一种格式下正常工作。 2) 如果我绕过预设过程,在程序运行的情况下,单击顶层 ToolStripMenuItem,程序会崩溃并显示“Cross-thread”消息。

详情: 窗体和窗体上的所有控件都是从开发环境中创建的。 Visual Studio 创建一个通过“Application.Run(new cfrmParent());”静态运行的启动类 'InitializeComponent() 设置我的所有控件没有任何问题。 我用“public cfrmCommand CmdFrm = new cfrmCommand();”实例化表单 然后我让一个单独的线程执行 CmdFrm.ShowDialog 以允许用户操作控件(并允许其他外部进程更新窗体上的显示)。发生错误 #2 时,它会针对 ShowDialog 命令执行此操作。

当表单加载时,我预设了 ToolStrip 菜单项。这就是问题发生的地方。表单上的所有其他控件及其相关代码都可以正常工作。如果我从顶部 ToolStripMenuItem 中删除所有子菜单项,则该项可以正常工作。

怀疑: 我对这个问题的“猜测”是 Visual Studio 无法通过适当的线程检查过程访问工具条项,从上层菜单项到下层菜单项。当我单击顶级项目时,它会尝试加载在不同线程上创建的较低级别项目。

当单击上级菜单项时,仅以编程方式创建、附加和预设下级菜单项对我来说是一个合适的解决方案,还是有更好的方法来解决这个问题? 感谢您的帮助。

我的代码来预设菜单项:

private void WriteMenuItem(System.Windows.Forms.ToolStripMenuItem myItem, string writeValue)
{
    if (myItem.GetCurrentParent().InvokeRequired != this.InvokeRequired)  
    {
        int myTest = 1;}
    if (this.InvokeRequired)
    {
        this.Invoke(new dlgWriteMenuItem(ivkWriteMenuItem), myItem, writeValue);}
    else
    {
        ivkWriteMenuItem(myItem, writeValue);}
}
private delegate void dlgWriteMenuItem(System.Windows.Forms.ToolStripMenuItem myItem, string writeValue);
private void ivkWriteMenuItem(System.Windows.Forms.ToolStripMenuItem myItem, string myValue)
{
    myItem.Checked = (myValue.Trim().ToUpper() == "TRUE");
}

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    试试:

    this.Invoke(delegate
    {
        // Do work
    });
    

    【讨论】:

      猜你喜欢
      • 2011-01-15
      • 2016-05-21
      • 2016-06-11
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多