为什么没有检测到非法交叉线程?

Mic*_*ers 2 .net winforms

所有:

我创建了一个Windows窗体和一个Button.在另一个线程中,我尝试更改按钮的文本,然后崩溃; 但如果我试图改变按钮的颜色,它可靠地成功.我认为如果您更改了任何Windows窗体控件属性,它将崩溃.有人能告诉我发生了什么事吗?

这是我的代码,在注释掉的行上没有崩溃(但我认为应该):

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();
Run Code Online (Sandbox Code Playgroud)

任何见解将不胜感激!

迈克尔

Han*_*ant 6

Control.ForeColor属性setter调用Invalidate()方法.这在Windows中是线程安全的.它只是在内部窗口状态中设置"此窗口需要重新绘制"状态位.直到稍后,当Paint事件运行时,窗口才会实际发生任何事情.在UI线程上.

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

其他示例是读取Text属性(不写入).还有记录的,InvokeRequired,BeginInvoke,EndInvoke,Invoke和CreateGraphics.而已.