避免跨線程錯誤:安全地從非 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