2017-04-21 31 views
-3

我创建的,从开发环境,多层次的ToolStripMenuItem堆栈中创建的线程以外的线程访问。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"); 
} 

回答

0

尝试:

this.Invoke(delegate 
{ 
    // Do work 
}); 
相关问题