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://mikedoszhang.blogspot.com/2011/10/non-ui-thread-operate-ui.html#!/2011/10/non-ui-thread-operate-ui.html

http://stackoverflow.com/questions/2587930/ramifications-of-checkforillegalcrossthreadcalls-false

posted @ 2012-09-07 10:45  heqichang  阅读(1038)  评论(1编辑  收藏  举报