Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ToolStripMenuItem:跨线程操作无效:从创建控件的线程以外的线程访问控件_C#_Multithreading - Fatal编程技术网

C# ToolStripMenuItem:跨线程操作无效:从创建控件的线程以外的线程访问控件

C# ToolStripMenuItem:跨线程操作无效:从创建控件的线程以外的线程访问控件,c#,multithreading,C#,Multithreading,我从开发环境中创建了一个多级ToolStripMenuItem堆栈 问题: 1) 代码(如下)用于预设toolstrip项目的值。有两个ToolStripMenuitems,myItem.GetCurrentParent().InvokeRequest不等于this.InvokeRequest。GetCurrentParent.InvokeRequired在一项中生成正确的结果,this.InvokeRequired在另一项中工作。所有其他项目都可以使用这两种格式正常工作。 2) 如果我绕过预设

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

问题: 1) 代码(如下)用于预设toolstrip项目的值。有两个ToolStripMenuitems,myItem.GetCurrentParent().InvokeRequest不等于this.InvokeRequest。GetCurrentParent.InvokeRequired在一项中生成正确的结果,this.InvokeRequired在另一项中工作。所有其他项目都可以使用这两种格式正常工作。 2) 如果我绕过预设进程,在程序运行时,单击顶级ToolStripMenuItem,程序将崩溃并显示“Cross thread”消息

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

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

怀疑: 我对问题的“猜测”是VisualStudio没有通过适当的线程检查过程访问toolstrip项,从上菜单项到下菜单项。当我单击顶级项目时,它会尝试加载在不同线程上创建的低级项目

当单击上级菜单项时,是否可以通过编程方式仅创建、附加和预设下级菜单项,或者是否有更好的方法解决此问题? 谢谢你的帮助

预设菜单项的我的代码:

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");
}
尝试:

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