處理 C# 多執行緒應用程式中的「跨執行緒操作無效」例外
在使用多執行緒的 C# 應用程式中,確保 UI 元素由負責建立它們的執行緒獨佔存取至關重要。 違反這項原則會導致可怕的「跨執行緒操作無效」異常。
了解 C# 執行緒與 UI 元素擁有權
C# 允許透過多個執行緒並發執行。每個執行緒在其自己的上下文中獨立運行。 至關重要的是,UI 元素(如文字方塊)屬於特定線程,通常是主 UI 線程。
問題:從未經授權的執行緒存取 UI 元素
當擁有執行緒以外的執行緒嘗試修改 UI 元素的屬性時,會出現此錯誤。 這是一種常見的場景,在處理來自後台執行緒的事件(例如串列埠資料接收)時經常會遇到。
解:實作調度程式呼叫
解決方案涉及使用排程器將操作封送到正確的執行緒上。 這保證了 UI 控制項的線程安全修改。
程式碼實作
以下是實施此解決方案的方法:
首先,定義一個委託:
<code class="language-csharp">private delegate void SetTextCallback(string text);</code>
接下來,建立一個方法來安全更新文字方塊:
<code class="language-csharp">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>
最後,在串列埠資料接收事件處理程序中,呼叫SetText
方法:
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { txt += serialPort1.ReadExisting(); SetText(txt); }</code>
此方法可確保 textBox1.Text
屬性安全性更新,防止出現「跨執行緒操作無效」例外。 InvokeRequired
檢查有效地決定是否需要調度程序呼叫。
以上是如何解決C#多執行緒中「跨執行緒操作無效」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!