【问题标题】:Cross-thread operation in DataReceived CallBackDataReceived CallBack 中的跨线程操作
【发布时间】:2015-02-17 17:42:03
【问题描述】:

我有一个带有一些选项卡的表单,在 Visual C# 中

此表单正在使用回调“serialPort1_DataReceived”读取串行端口

在其中一个选项卡中有一个名为 textBox_CN2 的文本框

当串行正在运行并且我单击此选项卡时,当表单尝试更改文本框中的文本时出现错误

跨线程操作无效:控件“textBox_CN2”从创建它的线程以外的线程访问。

这是代码的简化版本:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {

         buffer_in[count] = (char)serialPort1.ReadByte();
         count++;

         if (count > 10 && buffer_in[count - 1] == '#' && buffer_in[count - 2] == '@')
            {
               this.textBox_CN2.Text = string.Format("{0:F2}", buffer_in[2]);
            }

    }

谢谢

【问题讨论】:

    标签: multithreading visual-c#-express-2010


    【解决方案1】:

    使用Invoke() 像这样更新 UI:

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            int count = 0;
            char[] buffer_in;
    
            buffer_in[count] = (char)serialPort1.ReadByte();
            count++;
    
            if (count > 10 && buffer_in[count - 1] == '#' && buffer_in[count - 2] == '@')
            {
                this.Invoke((MethodInvoker)delegate
                {
                    this.textBox_CN2.Text = string.Format("{0:F2}", buffer_in[2]);
                });
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多