所有:
我创建了一个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)
任何见解将不胜感激!
迈克尔
Control.ForeColor属性setter调用Invalidate()方法.这在Windows中是线程安全的.它只是在内部窗口状态中设置"此窗口需要重新绘制"状态位.直到稍后,当Paint事件运行时,窗口才会实际发生任何事情.在UI线程上.
Winforms包含用于抑制异常的显式代码.
其他示例是读取Text属性(不写入).还有记录的,InvokeRequired,BeginInvoke,EndInvoke,Invoke和CreateGraphics.而已.