[英]Invoke ToolStripMenuItem
我试图找出是否有办法调用ToolStripMenuItem。
例如,当返回结果时,我正在调用Web服务(ASynchrously)。根据结果填充下拉项,(在回调方法中)
ToolStripMenuItem.DropDownItems.Add(new ToolStripItemEx("start"));
但我得到例外
跨线程操作无效:控制''从创建它的线程以外的线程访问。
没有与工具条项相关联的调用函数 ,还有另一种方法可以做到这一点吗? 我试图以完全错误的方式做到这一点吗? 任何输入都会有所帮助。
您正在尝试执行依赖于另一个线程中的控制主线程的代码,您应该使用Invoke
方法调用它:
toolStrip.Invoke(() =>
{
toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
});
从与控件最初创建的线程不同的线程访问控件成员/方法时,应该使用control.Invoke
方法,它将在调用委托中执行到主线程的编组。
编辑:由于您使用的是ToolStripMenuItem
而不是ToolStrip
,因此ToolStripMenuItem
没有Invoke
成员,因此您可以使用“ this.Invoke
”调用表单,也可以使用toolStrip
其父“ ToolStrip
”调用,这样:
toolStrip.GetCurrentParent().Invoke(() =>
{
toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
});
您正尝试从线程而不是主线程访问菜单项,因此请尝试以下代码:
MethodInvoker method = delegate
{
toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
};
if (ToolStripMenu.InvokeRequired)
{
BeginInvoke(method);
}
else
{
method.Invoke();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.