WinForm UI跨线程访问 Debug模式与非Debug模式下的区别

本文通过一个简单的WinForm应用程序示例,介绍了在调试模式下如何避免非UI线程操作UI组件导致的错误。详细解释了`checkForIllegalCrossThreadCalls`属性的作用,并提供了源代码层面的解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.cnblogs.com/heqichang/archive/2012/09/07/2674685.html

首先就从一个实验开始说起吧。在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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值