可能重复:
Cross-thread exception when setting WinForms.Form owner - how to do it right?
我是C#Windows窗体应用程序开发的新手。
在我的应用程序主窗体中,我们在其他线程中创建新窗体,如下所示。
Task.Factory.StartNew(
() =>
{
PlotForm plotForm = new PlotForm();
Application.Run(plotForm);
});
我希望始终在主窗体上显示该窗体。 Forms中有一个最顶层的属性。如果我将其设置为true,则它们也位于其他形式之上。
在互联网上,据说解决方案是设置所有者属性,当我设置此属性时,我得到了跨线程操作,因为表单创建了不同的线程。
Task.Factory.StartNew(
() =>
{
PlotForm plotForm = new PlotForm();
plotForm.Owner = this;
Application.Run(plotForm);
});
跨线程操作无效:控制从其创建的线程以外的线程访问的“Form1”。
你知道解决方案吗?
感谢。
答案 0 :(得分:1)
对于跨线程操作,您需要使用Invoke
。 “调用”调用告诉表单“请在您的线程中执行此代码而不是我的。”
Task.Factory.StartNew(
() =>
{
PlotForm plotForm = new PlotForm ();
this.Invoke((MethodInvoker)delegate()
{
plotForm.Owner = a;
plotForm.Show();
});
});