首頁 >後端開發 >C++ >如何在 C# 中從非 UI 執行緒安全地更新 UI 元素?

如何在 C# 中從非 UI 執行緒安全地更新 UI 元素?

Susan Sarandon
Susan Sarandon原創
2025-01-23 02:14:15250瀏覽

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

避免跨執行緒錯誤:安全地從非 UI 執行緒更新 UI 元素

在從非 UI 執行緒(例如串列埠資料接收事件產生的執行緒)與 UI 元素互動時,必須處理執行緒安全性問題以避免跨執行緒錯誤。

在C# 程式碼中,錯誤「跨執行緒操作無效:從建立控制項'textBox1' 的執行緒以外的執行緒存取控制項'textBox1'」的出現是因為UI 執行緒擁有textBox1 控制項,而從另一個執行緒存取它會導致線程關聯性衝突。

為了解決這個問題,必須使用調度程序,允許適當的執行緒(通常是 UI 執行緒)存取 UI 元素。在這種情況下,可以使用委託和 Invoke 方法來確保線程安全存取:

<code class="language-csharp">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;
  }
}</code>

現在,在 serialPort1_DataReceived 事件處理程序中:

<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
  txt += serialPort1.ReadExisting().ToString();
  SetText(txt.ToString());
}</code>

透過使用 SetText 方法,您可以將更新 textBox1 text 屬性的任務委託給 UI 線程,從而確保從非 UI 線程安全無誤地存取 UI 元素。

以上是如何在 C# 中從非 UI 執行緒安全地更新 UI 元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn