在BackgroundWorker中创建表单的实例

问题描述:

我想在BackgroundWorker中创建表单的新实例。我注意到,当我这样做时,新推出的表格会冻结。在BackgroundWorker中创建表单的实例

Frozen form

为什么这种形式冻结?我怎样才能解决这个问题?

+0

你不应该这样做,你试图解决什么底层的问题? – 2010-10-08 15:51:56

+0

如果您从ReportProgress事件创建新窗体,它将不会冻结。 – 2010-10-08 17:53:20

+0

谢谢sh_kamalh,我会在未来的项目中记住这一点。在这种特殊情况下,我决定将表单创建移动到一个函数中,该函数被称为'RunWorkerCompleted'。 – Pieter 2010-10-08 18:46:14

它冻结,因为你是在错误的线程中创建窗体 - 没有事件循环在后台线程中运行。

您应该只在UI线程中创建或触摸UI元素。 BackgroundWorker为此提供了一些挂钩,或者您可以使用Control.Invoke/BeginInvoke

当窗体“运行”时,它需要一个运行WndProc并处理来自Windows的传入消息的线程。你应该考虑在这里使用Application.Run()方法来启动你的表单。这将做必要的工作来确保WndProc正常运行,并且我相信你可以根据需要从后台线程调用它。

+1

你有部分权利,但这不能达到一个好的目的。抽取消息循环的线程必须是STA来制作剪切和粘贴以及拖放工作等基本内容。 BGW线程是一个线程池线程,它始终是MTA并且不能更改。 – 2010-10-08 16:12:43