CheckForIllegalCrossThreadCalls=false;的不安全性

我举个线程间不安全的例子,或许对线程间安全理解更深刻一些


   private void button1_Click(object sender, EventArgs e)
        {
            System.Threading.Thread thread1 = new System.Threading.Thread(new System.Threading.ThreadStart(threadfun1));
            thread1.Start();
        }
        void threadfun1()
        {
            double dNumber=0;
            if (double.TryParse(txtNumber.Text, out dNumber) == true)
            {
                double dReciprocal = 1 / Convert.ToDouble(Convert.ToDouble(txtNumber.Text));
                txtNumber.Text = dReciprocal.ToString();
            }

        }


txtNumber是一个文本框,输入一个数,点击按钮后使用线程算出其倒数
如果是多个线程的话,执行if (double.TryParse(txtNumber.Text, out dNumber) == true)还没有问题
但是执行double dReciprocal = 1 / Convert.ToDouble(Convert.ToDouble(txtNumber.Text));可能就出问题了,
因为这段时间txtNumber.Text值可能己经被其它线程改成0了,0没有倒数数,就会出错。(当然使用dNumber也不会出错)


使用代理后

        private void button1_Click(object sender, EventArgs e)
        {
            System.Threading.Thread thread1 = new System.Threading.Thread(new System.Threading.ThreadStart(threadfun1));
            thread1.Start();
        }
        void threadfun1()
        {
            funReciprocal(txtNumber.Text);
        }
    
        delegate void dltReciprocal(string strNumber);
        void funReciprocal(string strNumber)
        {
            if (txtNumber.InvokeRequired)

            {

//由线程调用时txtNumber.InvokeRequired为真,进入这里

                dltReciprocal evtReciprocal = new dltReciprocal(funReciprocal);
                txtNumber.Invoke(evtReciprocal, new object[] { strNumber });//Invoke的作用是执行权交到txtNumber的所有者来执行(在所有者线程中排队执行)。因为代理函数在所有者线程中排队执行,因此不会出现函数没有执行完,UI变量被更新的情况。
            }
            else

            {

//由所有者(窗体)调用时txtNumber.InvokeRequired为假,进入这里

                double dNumber = 0;
                if (double.TryParse(txtNumber.Text, out dNumber) == true)
                {
                    double dReciprocal = 1 / Convert.ToDouble(txtNumber.Text);
                    txtNumber.Text = dReciprocal.ToString();
                }
            }
        }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值