我有一个winforms应用程序,我在主窗体的Application.Run
之前运行BackgroundWorker。'RunWorkerCompleted'在错误线程上执行
当BackgroundWorker的完成后,在其RunWorkerCompleted
处理程序 - 它访问的主要形式,而我得到的异常:
“跨线程操作无效:控制‘Form1的’从访问 线程不是它创建的线程。“
因此,我认为错误曾与this comment其中指出RunWorkerCompleted
做“只会让UI线程上提出,如果UI线程创建的 BGW实例。”
(虽然它不是似乎像它是在一个单独的线程上创建的)。 (并且也参见this comment there)。
所以我创建了一个简单的测试,我BW.RunWorkerAsync();
之前Application.Run
(在“计划”),并在那里工作的罚款。抛出异常。
那么可能是什么问题?为什么与主窗体进行交互会抛出异常,但我正在从同一个线程运行BackgroundWorker?
(我不能在这里张贴整个代码,因为它是很长,发帖只是相关的代码就是我前面提到的 - 。它不抛出异常)
编辑
所以也许更具体的问题可以到位:如何让“UI线程创建BGW”?它是否必须在Application.Run中?显示表单后?是否不是取决于哪个线程创建了的BGW,而是哪个线程调用RunWorkerAsync?
EDIT 2
检查Thread.CurrentThread.ManagedThreadId
我看到它的 RunWorkerAsync
之前(因为它是DoWork +=
和RunWorkerCompleted +=
前),但的RunWorkerCompleted
处理内。
当单步执行代码并在RunWorkerAsync()
之后等待几秒钟 - 它们都具有相同的线程ID,并且运行良好(所以不仅偶然,正确的线程被选中)!
你试过调用形式? (另外,你正在寻找一个解决方案或解释) – Sayse 2014-08-29 10:21:41
我试图更好地理解它,所以我可以修复它不_need_“调用”(并避免在未来更多的陷阱)。 – ispiro 2014-08-29 10:22:23
*我不能在这里发布整个代码,因为它很长。只发布相关的代码就是我之前提到的 - 它不会抛出异常*那么您希望我们如何回答?即使我们这样做,它将纯粹是一种**猜测**,没有一些代码可以再现问题。 – 2014-08-29 10:25:55