显示表单始终位于以不同线程创建的其他表单之上

时间:2012-10-14 08:48:52

标签: c# winforms task-parallel-library

  

可能重复:
  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”。

你知道解决方案吗?

感谢。

1 个答案:

答案 0 :(得分:1)

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

Task.Factory.StartNew(
            () =>
            {
                PlotForm plotForm = new PlotForm ();
                this.Invoke((MethodInvoker)delegate()
                {                   
                   plotForm.Owner = a;
                   plotForm.Show();
                });
            });