避免 .NET UI 更新中的「跨執行緒操作無效」錯誤
在 .NET 中,嘗試從與創建 UI 元素的執行緒不同的執行緒修改 UI 元素會導致可怕的「跨執行緒操作無效」錯誤。這源自於一條關鍵規則:UI 操作必須在最初建立 UI 元素的執行緒上執行。
讓我們用程式碼範例來說明:
<code class="language-csharp">System.Threading.Thread t = new System.Threading.Thread(() => { // Perform intensive operations... listView1.Items.Add(lots of items); // Error prone line! // More UI updates... }); t.Start();</code>
此程式碼產生一個執行緒來處理任務。 但是,當執行緒嘗試更新 UI(向 listView1
新增項目)時,會發生錯誤,因為主 UI 執行緒上未發生更新。
UI 執行緒的安全方法
禁止從非 UI 執行緒直接進行 UI 操作。 這裡有兩個有效的解決方案:
Invoke
方法: 如果您擁有 UI 控制項的參考(如 listView1
),請使用 Invoke
方法。 此方法將操作排隊以在 UI 執行緒上執行。
BackgroundWorker
類別: BackgroundWorker
簡化了非同步操作。它創建一個後台線程並促進後台線程和 UI 線程之間的通信,使跨線程更新變得易於管理。
<code class="language-csharp">BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += (s, e) => { /* Create items here */ }; bw.RunWorkerCompleted += (s, e) => { /* Update listView1 here */ }; bw.RunWorkerAsync();</code>
Invoke
和 BackgroundWorker
都提供了處理跨執行緒操作的安全機制,確保 UI 更新僅發生在適當的執行緒上,防止出現「跨執行緒操作無效」錯誤。
以上是如何安全處理 .NET 中 UI 更新的跨執行緒操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!