看板 C_Sharp 關於我們 聯絡資訊
其實我是用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