我正在试图找出是否有办法调用ToolStripMenuItem。
例如,我在返回结果时调用Web服务(ASynchrously)。根据结果填充下拉项,(在回调方法中)
ToolStripMenuItem.DropDownItems.Add(new ToolStripItemEx("start"));
但我得到例外
跨线程操作无效:控制''从创建它的线程以外的线程访问。
没有与工具条项关联的调用函数, 还有其他方法可以做到这一点吗?我试图以完全错误的方式做到这一点吗?任何输入都会有所帮助。
答案 0 :(得分:20)
您正在尝试执行依赖于另一个线程中的控制主线程的代码,您应该使用Invoke
方法调用它:
toolStrip.Invoke(() =>
{
toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
});
当从与控件最初创建的线程不同的线程访问控件成员/方法时,应该使用control.Invoke
方法,它将在调用委托中将执行封送到主线程。< / p>
修改:由于您使用ToolStripMenuItem
而不是ToolStrip
,ToolStripMenuItem
没有Invoke
成员,因此您可以使用表单由“this.Invoke
”或您的toolStrip
其父级“ToolStrip
”调用,因此:
toolStrip.GetCurrentParent().Invoke(() =>
{
toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
});
答案 1 :(得分:5)
您正尝试从线程而不是主线程访问菜单项,因此请尝试以下代码:
MethodInvoker method = delegate
{
toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
};
if (ToolStripMenu.InvokeRequired)
{
BeginInvoke(method);
}
else
{
method.Invoke();
}