避免跨线程错误:安全地从非 UI 线程更新 UI 元素
在从非 UI 线程(例如串口数据接收事件生成的线程)与 UI 元素交互时,必须处理线程安全问题以避免跨线程错误。
在 C# 代码中,错误“跨线程操作无效:从创建控件 'textBox1' 的线程以外的线程访问控件 'textBox1'”的出现是因为 UI 线程拥有 textBox1 控件,而从另一个线程访问它会导致线程关联性冲突。
为了解决这个问题,必须使用调度程序,允许适当的线程(通常是 UI 线程)访问 UI 元素。在这种情况下,可以使用委托和 Invoke 方法来确保线程安全访问:
delegate void SetTextCallback(string text);
private void SetText(string text)
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}
现在,在 serialPort1_DataReceived 事件处理程序中:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
txt = serialPort1.ReadExisting().ToString();
SetText(txt.ToString());
}
通过使用 SetText 方法,您可以将更新 textBox1 text 属性的任务委托给 UI 线程,从而确保从非 UI 线程安全无误地访问 UI 元素。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3