忽略跨线程访问的错误 CheckForIllegalCrossThreadCalls = false

CheckForIllegalCrossThreadCalls = false

允许跨线程访,但是此不稳定,要慎用

设置一个如下的界面,点击“button1”,改变label的值,改变label值是通过建立一个线程启动线程执行方法实现改变的,当在button的click事件函数里不加CheckForIllegalCrossThreadCalls = false这句话的时候,默认不允许跨线程访问,用异常捕获会提示:
线程间操作无效:从不是创建控件label的线程去访问它。
创建控件label的线程是页面启动的主线程,而我改变label的值是通过自己创建的另一个线程去访问,即是跨线程操作,系统不允许这么做
在这里插入图片描述
在这里插入图片描述
当在button的click事件中,加入这句话的时候Form1.CheckForIllegalCrossThreadCalls = false;发现,label的值改变了,系统也允许跨线程访问label了
在这里插入图片描述

给出验证不稳定性的一个例子:

即使已经加了Form1.CheckForIllegalCrossThreadCalls = false这句话,但是当我在button的click事件下连续两次调用自己创建的线程的时候,问题出现了,系统不提示不允许跨线程访问了,但是我改变label值的时候,提示到以下错误 ;
即:通过CheckForIllegalCrossThreadCalls的值忽略跨线程错误,但是这个时候会监测到异常
在这里插入图片描述
综上:不建议过多的使用允许跨线程访问,以下的附加的代码,关于用invoke方法解决该问题,参考下一篇博文

// 通过CheckForIllegalCrossThreadCalls的值忽略跨线程错误,这时会抛出异常 
 private void button1_Click(object sender, EventArgs e)
 {
       Form1.CheckForIllegalCrossThreadCalls = false;//允许跨线程访问
        //第一次调用
        btn1 = new Thread(new ThreadStart(doThread));
        btn1.IsBackground = true;
        btn1.Start();
        Thread.Sleep(50);
       //第二次调用
     //  btn1 = new Thread(new ThreadStart(doThread));
     //  btn1.IsBackground = true;
     //  btn1.Start();
 }
 // 不使用invoke方法直接进入Control 
 void doThread()
 {
     for (int i = 0; i < 100; i++)
     {
         test();
         Thread.Sleep(10);
     }
 }
 // 模拟一个实际应用
 // 对label1赋值后立马检查他的值,如果已经被改过则抛出异常 
 void test()
 {
     try
     {
         string strText = Guid.NewGuid().ToString();//随机生成一串字符
         this.label1.Text = strText;//改变label.Text的值     
          if (this.label1.Text != strText)
          {
              MessageBox.Show("label1的值意外改变", "错误提示");
          }    
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message, "跨线程访问错误提示");
     }        
 }
        

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值