【发布时间】: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