Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么在bin\Debug中运行exe时未引发跨线程操作异常_C#_Visual Studio_Debugging_Multithreading - Fatal编程技术网

C# 为什么在bin\Debug中运行exe时未引发跨线程操作异常

C# 为什么在bin\Debug中运行exe时未引发跨线程操作异常,c#,visual-studio,debugging,multithreading,C#,Visual Studio,Debugging,Multithreading,我正在调试一个应用程序,在代码的某个地方,一个线程试图访问另一个线程创建的列表框。在尝试访问listbox时,应用程序在调试时引发“跨线程操作无效:从创建它的线程以外的线程访问的控件“listbox”异常。但是,当我在bin\Debug文件夹中运行此应用程序的输出时,我没有得到异常对话框,并且我可以看到listbox是从非所有者线程成功访问的,因此这使我认为这里存在行为差异,而不仅仅是被抑制的异常。我可以通过form_load event中的以下行进行调试来克服此异常 Control.Check

我正在调试一个应用程序,在代码的某个地方,一个线程试图访问另一个线程创建的列表框。在尝试访问listbox时,应用程序在调试时引发“跨线程操作无效:从创建它的线程以外的线程访问的控件“listbox”异常。但是,当我在bin\Debug文件夹中运行此应用程序的输出时,我没有得到异常对话框,并且我可以看到listbox是从非所有者线程成功访问的,因此这使我认为这里存在行为差异,而不仅仅是被抑制的异常。我可以通过form_load event中的以下行进行调试来克服此异常

Control.CheckForIllegalCrossThreadCalls = false;

但是,这种不同行为背后的原因是什么?

是的,只有在附加调试器时才会检查这种行为。这是必要的,因为有很多.NET1.x代码违反了这一规则。这不是一个明显的问题

更大的问题是这样的代码侥幸逃脱了惩罚。幸运的是,没有过多考虑偶尔出现的绘画问题,或者认为在应用程序死锁时中止应用程序并每天重新启动一次是可以接受的。因为程序员没有诊断就没有发现问题的真正希望

微软非常关心向后兼容,即使它是有缺陷的兼容。修复是非常好的,即使它有时是错误的(Show(owner)在不应该的时候被检查)。有时会忽略检查框架中的代码是否违反规则。当线程依赖关系是间接的时会发生这种情况。最常见的情况是在工作线程中更新数据绑定控件的数据源(首先解除绑定!),并使用侦听SystemEvents.UserPreferenceChanged事件的控件(不要在第二个线程上创建UI!)


作为参考,相关代码出现在控制类的静态构造函数中:

static Control()
{
    //...
    checkForIllegalCrossThreadCalls = Debugger.IsAttached;
    //...
}