Chr*_*low 5 c# multithreading marshalling winforms
控件只能由创建它的线程访问 - 我知道这一点.
这段代码完美无瑕 - 只要我没有在环境中运行.在BindingList <>上调用.Add()方法的环境中,我得到了这个方便的小错误:
An Exception has occurred
EXCEPTION : Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.
IN METHOD : get_Handle
AT LINE : 0
CLASS : System.Windows.Forms.Control
Run Code Online (Sandbox Code Playgroud)
注意被违反的控件的名称是空白的 ...我认为如果问题在于更新BindingList <>,那么如果我在环境中运行则无关紧要.尽管如此,这就是我所看到的. 此外,即使抛出异常,.Add()也能成功完成!!
显然,它在我的生产环境中并不是一件大事(但是?),因为它只发生在Studio中; 和是的,我可以调用GUI线程来执行的添加,或储存在GUI线程一个地方增加了以后检索它们......我不是在寻找一个解决,但更使我感兴趣的答案这个问题:
为什么错误只出现在工作室?
如果是MDA(托管调试助手),则该错误仅可能发生在VS中,而不是运行时异常。MDA 会告诉你,当你在做一些通常但不是 100% 总是会在生产代码中给你带来麻烦的事情时(最终,即使它看起来 99% 的时间都有效)你的机器)。
您应该调用 UI 线程来执行 Add 方法。
编辑:要100%彻底...没有Reflector(因为我的过期了-你在听Red Gate吗?!)我猜测Control类检查你是否在UI线程上,在后台线程上抛出异常如果不是,那么无论如何都会重新绘制 UI。由于后台线程已经添加了该项目,UI 重绘会看到它并按预期将其绘制到 UI,但是您的后台线程仍然会看到异常,并且您要么在 catch 块中默默地吞下它,要么后台线程被终止(这在您的应用程序中可能是可以容忍的,例如 BG 线程是线程池线程)。
| 归档时间: |
|
| 查看次数: |
592 次 |
| 最近记录: |