我有一個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