【发布时间】: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