小编典典

跨线程操作无效:控件'textBox1'从它创建的线程以外的线程访问

all

我想使用 UART 将温度值从微控制器发送到 C# 接口并显示温度Label.Content。这是我的微控制器代码:

while(1) {
   key_scan(); // get value of temp
   if (Usart_Data_Ready())
   {
      while(temperature[i]!=0)
      {
         if(temperature[i]!=' ')
         {
            Usart_Write(temperature[i]);
            Delay_ms(1000);
         }
         i = i + 1;
      }
      i =0;
      Delay_ms(2000);
   }
}

我的 C# 代码是:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
   txt += serialPort1.ReadExisting().ToString();
   textBox1.Text = txt.ToString();
}

但出现异常“ 跨线程操作无效:控制’textBox1’从创建它的线程以外的线程访问 ”请告诉我如何从我的微控制器获取温度字符串并删除此错误!


阅读 72

收藏
2022-06-23

共1个答案

小编典典

在您的serialPort1_DataReceived方法中接收到的数据来自另一个线程上下文而不是 UI 线程,这就是您看到此错误的原因。
要解决此问题,您必须使用 MSDN 文章中所述的调度程序:
如何:对 Windows
窗体控件进行线程安全调用

因此,不要直接在serialport1_DataReceived方法中设置 text 属性,而是使用以下模式:

delegate void SetTextCallback(string text);

private void SetText(string text)
{
  // InvokeRequired required compares the thread ID of the
  // calling thread to the thread ID of the creating thread.
  // If these threads are different, it returns true.
  if (this.textBox1.InvokeRequired)
  { 
    SetTextCallback d = new SetTextCallback(SetText);
    this.Invoke(d, new object[] { text });
  }
  else
  {
    this.textBox1.Text = text;
  }
}

所以在你的情况下:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
  txt += serialPort1.ReadExisting().ToString();
  SetText(txt.ToString());
}
2022-06-23