作者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
1F:→ StarTouching:PS. 最後我用begininvoke 看起来似乎是暂时解决了 09/03 19:16
2F:→ s3748679:有没有办法把这个情况浓缩成一个小sample出来? 09/03 19:22
3F:→ StarTouching:不过我C#不非常熟 只能写Managed C++ 09/03 21:41
4F:→ jenesis:要在执行序里面动用到UI的资源就是跨执行序 所以你要用 09/03 21:55
5F:→ jenesis:dispatcher切到ui thread然後再切回来 就是这样... 09/03 21:56
6F:→ StarTouching:不过问题在於complete事件设计上应该属於UI thread 09/03 22:08
7F:推 s3748679:老实说在RunWorkerCompleted用上Form2.Show() 我测试并没 09/03 22:09
8F:→ s3748679:碰上这种问题 09/03 22:09
9F:→ s3748679:(所以真的建议原Po另外开一个专案 想办法用较少的程式码 09/03 22:10
10F:→ s3748679:重现这种情况 09/03 22:10