【问题标题】:Show Form Always On Top Of Other Form Which is Created In Different Thread [duplicate]始终在不同线程中创建的其他表单之上显示表单[重复]
【发布时间】:2012-10-14 08:48:51
【问题描述】:

可能重复:
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”从创建它的线程以外的线程访问。

您知道解决方案吗?

谢谢。

【问题讨论】:

  • 为什么需要在不同的线程中运行?
  • 这是我知道的唯一一种跨线程检查不准确的情况。 Windows 确实支持这一点。但是支持在线程池线程上运行表单,线程必须是 STA 单元。需要一个普通的 Thread 对象和对其 SetApartmentState 方法的调用。不要这样做。

标签: c# winforms task-parallel-library


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2017-12-12
    • 1970-01-01
    • 2011-03-26
    • 2013-02-13
    • 2013-04-10
    • 1970-01-01
    相关资源
    最近更新 更多