避免跨執行緒錯誤:安全地從非 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中文網其他相關文章!