[問題] BackgroundWorker 跨執行緒作業無效

看板C_Sharp (C#)作者 (撫星)時間12年前 (2013/09/03 18:19), 編輯推噓1(109)
留言10則, 3人參與, 最新討論串1/1
其實我是用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

09/03 19:16, , 1F
PS. 最後我用begininvoke 看起來似乎是暫時解決了
09/03 19:16, 1F

09/03 19:22, , 2F
有沒有辦法把這個情況濃縮成一個小sample出來?
09/03 19:22, 2F

09/03 21:41, , 3F
不過我C#不非常熟 只能寫Managed C++
09/03 21:41, 3F

09/03 21:55, , 4F
要在執行序裡面動用到UI的資源就是跨執行序 所以你要用
09/03 21:55, 4F

09/03 21:56, , 5F
dispatcher切到ui thread然後再切回來 就是這樣...
09/03 21:56, 5F

09/03 22:08, , 6F
不過問題在於complete事件設計上應該屬於UI thread
09/03 22:08, 6F

09/03 22:09, , 7F
老實說在RunWorkerCompleted用上Form2.Show() 我測試並沒
09/03 22:09, 7F

09/03 22:09, , 8F
碰上這種問題
09/03 22:09, 8F

09/03 22:10, , 9F
(所以真的建議原Po另外開一個專案 想辦法用較少的程式碼
09/03 22:10, 9F

09/03 22:10, , 10F
重現這種情況
09/03 22:10, 10F
文章代碼(AID): #1I9RUmBq (C_Sharp)
文章代碼(AID): #1I9RUmBq (C_Sharp)