.net 为什么没有检测到非法的跨线程?

.net 为什么没有检测到非法的跨线程?,.net,winforms,.net,Winforms,全部: 我创建了一个Windows窗体和一个按钮。在另一个线程中,我试图更改按钮的文本,但它崩溃了;但如果我尝试更改按钮的颜色,它肯定会成功。我认为如果您更改任何Windows窗体控件属性,它都会崩溃。谁能告诉我发生了什么事 下面是我的代码,它不会在注释掉的行中崩溃(但我认为应该): 任何见解将不胜感激 迈克尔 它确实成功了 不要把你的运气推得太远。它迟早会崩溃的。始终在GUI线程上执行修改。Control.ForeColor属性设置程序调用Invalidate()方法。这在Windows中是线

全部:

我创建了一个Windows窗体和一个按钮。在另一个线程中,我试图更改按钮的文本,但它崩溃了;但如果我尝试更改按钮的颜色,它肯定会成功。我认为如果您更改任何Windows窗体控件属性,它都会崩溃。谁能告诉我发生了什么事

下面是我的代码,它不会在注释掉的行中崩溃(但我认为应该):

任何见解将不胜感激

迈克尔

它确实成功了


不要把你的运气推得太远。它迟早会崩溃的。始终在GUI线程上执行修改。

Control.ForeColor属性设置程序调用Invalidate()方法。这在Windows中是线程安全的。它仅将“此窗口需要重新绘制”状态位设置为内部窗口状态。直到稍后运行绘制事件时,窗口才真正发生任何变化。在UI线程上

Winforms包含用于抑制异常的显式代码

其他示例包括读取文本属性(而不是写入)。还有文档化的,InvokeRequired,BeginInvoke,EndInvoke,Invoke和CreateGraphics。就这样。

说:

从创建控件的线程以外的线程调用控件而不使用Invoke方法是不安全的

不看一眼就跑过马路是不安全的。你不会总是被车撞到,但你的机会真是太大了

此异常在调试期间以及在某些情况下在运行时可靠地发生。当调试在.NET Framework 2.0版之前使用.NET Framework编写的应用程序时,您可能会看到此异常。强烈建议您在看到此问题时修复它,但您可以通过将CheckForIllegalCrossThreadCalls属性设置为false来禁用它


也许你是对的,但我真的很惊讶,通常前景色设置没有任何错误。为什么?这不是对用户界面的修改吗?在调试过程中不应该在主线程中完成吗?@Marco:在(比如)安全补丁之后,客户端计算机上的行为可能会发生变化——除非它是记录在案的行为。感谢您的澄清。作为记录,微软的文档不允许有任何歧义,只是声明:“当您在调试器中运行应用程序时,并且创建控件的线程以外的线程尝试调用该控件,调试器会引发InvalidOperationException”。我希望他们能提供多一点细节……如果文档是完美的,就不需要像StackOverflow这样的网站:)准确率为98%。出于学术兴趣,这些例子是你从采煤工作面的个人经验中发现的,还是你自己研究过的(如果是,如何研究的),或者他们真的被记录在什么地方了?
Thread thr = new Thread(() => { 
    //myButton.ForeColor = Color.Purple; // this never causes a crash :=(
    myButton.Text = Color.Purple.ToString(); // this always causes a crash.
}); // 
thr.Start();