DataReceived CallBack中的跨线程操作

时间:2014-12-18 20:20:58

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

我有一个带有一些标签的表单,在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]);
            }

    }

由于

1 个答案:

答案 0 :(得分: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]);
            });
        }

    }