WinForm UI跨线程访问 Debug模式与非Debug模式下的区别
首先就从一个实验开始说起吧。在VS中建一个WinForm的工程,在界面上就放一个Label和一个Button,然后为按钮添加一个点击事件,修改代码如下:
private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(() => { this.label1.Text = "Thread Test"; }); thread.Start(); }
然后我们按F5进入调试模式,点击Button之后,我们就会得到以下这个错误:
但是如果我们按Ctrl+F5来运行这个程序,那么就不会有这个错误。你直接在该工程下的Debug目录中运行该程序也不会有这个错误发生。这是为什么?如果熟悉WinForm开发的人都应该知道一个原则就是不要在非UI线程去操作UI界面,但是微软并没有强制要求程序员必须这么做,所以实际运行程序的时候,并没有UI跨线程访问的检查,这个检查只有在Debug模式下才会有,也方便程序员调试时避免UI跨线程的访问。我们可以用Reflctor查看Cotrol类下的静态构造函数中,就可以看到如下代码:
static Control() { checkForIllegalCrossThreadCalls = Debugger.IsAttached; }
参考链接:
http://stackoverflow.com/questions/2587930/ramifications-of-checkforillegalcrossthreadcalls-false