在BackgroundWorker中创建表单的实例
问题描述:
答
它冻结,因为你是在错误的线程中创建窗体 - 没有事件循环在后台线程中运行。
您应该只在UI线程中创建或触摸UI元素。 BackgroundWorker
为此提供了一些挂钩,或者您可以使用Control.Invoke
/BeginInvoke
。
答
当窗体“运行”时,它需要一个运行WndProc并处理来自Windows的传入消息的线程。你应该考虑在这里使用Application.Run()
方法来启动你的表单。这将做必要的工作来确保WndProc正常运行,并且我相信你可以根据需要从后台线程调用它。
+1
你有部分权利,但这不能达到一个好的目的。抽取消息循环的线程必须是STA来制作剪切和粘贴以及拖放工作等基本内容。 BGW线程是一个线程池线程,它始终是MTA并且不能更改。 – 2010-10-08 16:12:43
你不应该这样做,你试图解决什么底层的问题? – 2010-10-08 15:51:56
如果您从ReportProgress事件创建新窗体,它将不会冻结。 – 2010-10-08 17:53:20
谢谢sh_kamalh,我会在未来的项目中记住这一点。在这种特殊情况下,我决定将表单创建移动到一个函数中,该函数被称为'RunWorkerCompleted'。 – Pieter 2010-10-08 18:46:14