2010-10-19 49 views
20

运行exe文件我调试应用程序,并在某处的代码,一个线程试图达到由另一个线程创建的列表框中没有抛出横纱操作异常。在尝试访问列表框,应用程序将引发“跨线程操作无效:控制‘列表框中’从比它创建的线程以外的线程访问”异常而调试。但是,当我在bin \ Debug文件夹中运行此应用程序的输出时,我没有得到异常对话框,并且我可以看到列表框已成功从非所有者线程访问,所以这使我认为这里存在行为差异,而不仅仅是一个抑制的例外。我能过去这个例外在Form_Load事件为什么而斌调试

Control.CheckForIllegalCrossThreadCalls = false; 

以下行调试但是这背后的不同行为的原因是什么?

回答

36

是的,这是只有当调试器附加检查。这是必要的,因为存在违反此规则的.NET 1.x代码的批次。这不是一个明显的。

更大的问题是,这样的代码逃脱它。要么运气好,不要过多考虑偶尔的绘画问题,或者考虑在应用程序僵持时放弃应用程序,并在一天内可以接受时重新启动应用程序。因为程序员没有真正希望在没有诊断的情况下发现问题。

微软非常关心向后compat的,即使是越野车COMPAT。该修复非常好,即使它有时是错误的(Show(owner)被检查时它不应该)。有时候忽略了检查它是否违反规则的框架中的代码。当线程依赖是间接的时候会发生什么。那最常见的情况进行更新数据绑定控件的数据源的工作线程(取消第一!),并使用该侦听SystemEvents.UserPreferenceChanged性事件的控制(不上第二个线程创建UI!)


作为参考,相关代码存在于控制类的静态构造:

static Control() 
{ 
    //... 
    checkForIllegalCrossThreadCalls = Debugger.IsAttached; 
    //... 
} 
相关问题