【发布时间】:2010-12-02 03:23:35
【问题描述】:
更新:这是一篇 MSDN 文章 How to: Make Thread-Safe Calls to Windows Forms Controls。它指出:
.NET Framework 可帮助您检测 当您访问控件时 以一种不是线程安全的方式。 当你运行你的应用程序时 在调试器中,以及其他线程 比创建控件的那个 试图调用该控件, 调试器引发 InvalidOperationException 与 消息,“控制控制名称 从线程以外的线程访问 创建它的线程。”
此异常可靠地发生在 调试,并且在某些情况下 情况下,在运行时。
我之前的经验是,异常也是在运行时抛出的。
感谢 Spence 为我指明了正确的方向。
我在 WinForms 应用程序中有一个非常常见的错误:后台线程直接访问 UI 控件而不是使用 Control.BeginInvoke()。
我的问题如下:我看到 InvalidOperationException“跨线程操作无效:控制 'uxCheckStatus' 从创建它的线程以外的线程访问。”在后台线程的调试器中,但随后它在 WinForms 内部的某个地方被吞没了。
我希望它会杀死后台线程和整个应用程序。
此外,触发它的代码uxCheckStatus.Text = "success"; 有时会在抛出异常期间/之后执行,即标签文本显示为“成功”!我基本上迷路了。还有其他人遇到这种行为吗?
我在带有 1 个按钮的全新 WinForms 解决方案上重现它,两者都使用 ThreadPool 和 Thread 作为邪恶的后台线程。
如果我在后台线程上抛出一个新的 InvalidOperationException(),它会杀死应用程序。所以我唯一的猜测是 WinForms 在某个地方处理了这个特定的异常,但我在网络上找不到对这种行为的引用。
我运行 .NET 3.5,VS 2008。
【问题讨论】: