线程间操作无效:从不是创建控件”txtContent”的线程访问它

出现的问题:

  void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

            byte[] readBuffer = new byte[seriaReceive.ReadBufferSize];

            seriaReceive.Read(readBuffer, 0, readBuffer.Length);

            this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });

            data11 = readBuffer;

   UpdateTextBox(ByteArrayToHexString(data11));

        }

出现的问题主要就是我们在UI线程创建的子线程操作UI控件,访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。此时系统就会报出此错误信息。

==>解决办法

  void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

            byte[] readBuffer = new byte[seriaReceive.ReadBufferSize];

            seriaReceive.Read(readBuffer, 0, readBuffer.Length);

            this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });

            data11 = readBuffer;

 

            new Thread(Check).Start();

 

        }

 

        public void Check()

        {

            lock (this)

                Invoke(new MethodInvoker(delegate ()

                {

                    UpdateTextBox(ByteArrayToHexString(data11));

                }));

        }

本质上就是将需要刷新主线程的代码放到子线程中,也就是用单独一个线程来进行操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值