作者StarTouching (撫星)
看板C_Sharp
標題[問題] BackgroundWorker 跨執行緒作業無效
時間Tue Sep 3 18:19:26 2013
其實我是用CLI/C++寫 但我想WinForm的經驗這裡可能比較多...
我遇到的問題很有趣也很棘手
我用background worker處理multi thread的問題
結果遇到「跨執行緒作業無效」
大部分這個問題都是因為在 DoWork 存取UI元件
不過我卻不是這樣。
我把UI控制寫在 RunWorkerCompleted 裡面
本來運作也沒問題
甚至應該說大部分時候都沒問題
但加入一小段程式碼後 就在 RunWorkerCompleted 跳出「跨執行緒作業無效」
沒錯 這很奇怪 RunWorkerCompleted 使用上應該和 UI 屬於同thread
不可能遇到這種exception,而我本來也確實運作正常。
我所加入的code,是在Form1()建構子中呼叫一個對話方塊
newform.openDialog(); //註解掉這行就不會出現錯誤
之後一樣在建構子中 呼叫我的 background worker
結果就出現這個錯誤 很奇怪 兩者理當沒有關聯。
而且如果不是寫在建構子 而是按鍵觸發 就一樣能正常運作。
實測 RunWorkerCompleted 的 thread id 會變得跟 DoWork 一樣
這不科學。
聽說這可能是.NET的 backgroundworker 的bug
不知有沒有前輩對這問題比較了解的?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.171.205.52
→ StarTouching:PS. 最後我用begininvoke 看起來似乎是暫時解決了 09/03 19:16
→ s3748679:有沒有辦法把這個情況濃縮成一個小sample出來? 09/03 19:22
→ StarTouching:不過我C#不非常熟 只能寫Managed C++ 09/03 21:41
→ jenesis:要在執行序裡面動用到UI的資源就是跨執行序 所以你要用 09/03 21:55
→ jenesis:dispatcher切到ui thread然後再切回來 就是這樣... 09/03 21:56
→ StarTouching:不過問題在於complete事件設計上應該屬於UI thread 09/03 22:08
推 s3748679:老實說在RunWorkerCompleted用上Form2.Show() 我測試並沒 09/03 22:09
→ s3748679:碰上這種問題 09/03 22:09
→ s3748679:(所以真的建議原Po另外開一個專案 想辦法用較少的程式碼 09/03 22:10
→ s3748679:重現這種情況 09/03 22:10