」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何從C#中的非UI線程安全地更新UI元素?

如何從C#中的非UI線程安全地更新UI元素?

發佈於2025-02-06
瀏覽:917

How to Safely Update UI Elements from Non-UI Threads in C#?

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