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

如何在 C# 中從非 UI 執行緒安全地更新 UI 控制項?

Mary-Kate Olsen
發布: 2025-01-23 02:27:10
原創
877 人瀏覽過

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

C#跨執行緒操作驗證:從非UI執行緒存取控制項

在非建立控制項的執行緒中存取UI元素(例如TextBox)時,可能會遇到例外狀況:「跨執行緒操作無效:從非建立它的執行緒存取控制項'textBox1'」。這是因為每個UI元素都與一個特定線程關聯,用於處理事件和修改。

在本例中,您嘗試從serialport1_DataReceived事件處理程序更新textBox1控件,由於串口操作的非同步特性,該處理程序在單獨的執行緒上執行。

解:

為了解決此問題並安全地從非UI線程訪問textBox1控件,您需要確保所有與UI元素的交互都在主(UI)線程上調用。這可以使用調度程序來實現,調度程序提供了一種跨線程通訊機制,並確保UI更新在正確的執行緒上執行。

以下是使用委託安全性更新textBox1控制項的serialport1_DataReceived方法的修改版本:

<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
  // 在UI线程上更新'txt'变量
  txt += serialPort1.ReadExisting().ToString();

  // 使用委托在UI线程上访问'textBox1'控件
  SetTextCallback d = new SetTextCallback(SetText);
  this.Invoke(d, new object[] { txt.ToString() });
}

private delegate void SetTextCallback(string text);

private void SetText(string text)
{
  // 检查'textBox1'控件是否在不同的线程上创建
  if (this.textBox1.InvokeRequired)
  { 
    this.Invoke(d, new object[] { text });
  }
  else
  {
    // 如果在UI线程上创建,则直接更新'textBox1'控件
    this.textBox1.Text = text;
  }
}</code>
登入後複製

透過這種方法,您可以確保始終在主(UI)線程上存取和修改textBox1控件,從而解決跨線程操作異常。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板