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

来源:互联网 发布:矩阵乘法公式 编辑:程序博客网 时间:2024/06/10 01:06

出现的问题:

  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));

                }));

        }

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

0 0