1

可能重复:
设置 WinForms.Form 所有者时的跨线程异常 - 如何正确执行?

我是 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”从创建它的线程以外的线程访问。

你知道解决办法吗?

谢谢。

4

1 回答 1

1

对于跨线程操作,您需要使用Invoke. “invoke”调用告诉表单“请在你的线程而不是我的线程中执行此代码”。

Task.Factory.StartNew(
            () =>
            {
                PlotForm plotForm = new PlotForm ();
                this.Invoke((MethodInvoker)delegate()
                {                   
                   plotForm.Owner = a;
                   plotForm.Show();
                });
            }); 
于 2012-10-14T09:06:35.560 回答