我想弄清楚是否有办法调用 ToolStripMenuItem。
例如,当返回结果时,我正在调用 Web 服务(异步)。我根据结果填充下拉项,(在回调方法中)
ToolStripMenuItem.DropDownItems.Add(new ToolStripItemEx("start"));
但我得到了例外
跨线程操作无效:控件''从创建它的线程以外的线程访问。
没有与工具条项关联的调用函数,还有其他方法可以做到这一点吗?我是否试图以完全错误的方式做到这一点?任何输入都会有所帮助。
我想弄清楚是否有办法调用 ToolStripMenuItem。
例如,当返回结果时,我正在调用 Web 服务(异步)。我根据结果填充下拉项,(在回调方法中)
ToolStripMenuItem.DropDownItems.Add(new ToolStripItemEx("start"));
但我得到了例外
跨线程操作无效:控件''从创建它的线程以外的线程访问。
没有与工具条项关联的调用函数,还有其他方法可以做到这一点吗?我是否试图以完全错误的方式做到这一点?任何输入都会有所帮助。
您正在尝试在另一个线程中执行依赖于控制主线程的代码,您应该使用Invoke以下方法调用它:
toolStrip.Invoke(() =>
{
toolStrip.DropDownItems.Add(new ToolStripItemEx("start"));
});
当从与最初创建控件的线程不同的线程访问控件成员/方法时,您应该使用control.Invoke方法,它会将调用委托中的执行编组到主线程。
编辑:由于您使用的是ToolStripMenuItemnot 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();
}