- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在调试一个应用程序,在代码的某处,一个线程试图访问另一个线程创建的列表框。在尝试访问列表框时,应用程序会在调试时抛出“跨线程操作无效:控制 'listbox' 从创建它的线程以外的线程访问”异常。但是,当我在 bin\Debug 文件夹中运行此应用程序的输出时,我没有看到异常对话框,我可以看到列表框已从非所有者线程成功访问,所以这让我认为这里存在行为差异,不仅仅是一个被抑制的异常。我可以在 form_load 事件中使用以下行在调试中克服此异常
Control.CheckForIllegalCrossThreadCalls = false;
但这种不同行为背后的原因是什么?
最佳答案
是的,只有在附加调试器时才会检查。这是必要的,因为 很多 .NET 1.x 代码违反了这条规则。这不是一个明显的。
更大的问题是这样的代码逃脱了它。要么运气好,不要过多考虑偶尔出现的绘画问题,要么认为应用程序死锁时中止应用程序并每天重新启动一次是可以接受的。因为程序员没有真正希望在没有诊断的情况下发现问题。
Microsoft 非常关心向后兼容,即使它是错误的兼容。修复非常好,即使它有时是错误的(Show(owner) 在不应该检查的时候被选中)。并且有时会忽略检查框架中违反规则的代码。当线程依赖是间接的时会发生这种情况。最常见的情况是在工作线程中更新数据绑定(bind)控件的数据源(首先取消绑定(bind)!)并使用监听 SystemEvents.UserPreferenceChanged 事件的控件(不要在第二个线程上创建 UI!)
作为引用,相关代码存在于 Control 类的静态构造函数中:
static Control()
{
//...
checkForIllegalCrossThreadCalls = Debugger.IsAttached;
//...
}
关于c# - 为什么在bin\Debug中运行exe没有跨线程运行异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3972727/
我是一名优秀的程序员,十分优秀!