問題:
長時間運行的資料庫操作可能會凍結您的主應用程式窗口,導致進度條無回應。發生這種情況是因為資料庫任務阻塞了主 UI 執行緒。
BackgroundWorkers 與多執行緒:
BackgroundWorker
類別提供了一種解決方案,將冗長的任務卸載到單獨的線程,從而保留 UI 回應能力。 然而,正確管理此後台執行緒的 UI 更新至關重要。
安全更新 UI:
修改 UI 元素需要使用主執行緒的排程器。 從後台執行緒直接更新 UI 控制項是不安全的,並且會導致錯誤。
解:
要解決凍結問題,請使用專用的 BackgroundWorker
專門用於進度條更新。這使資料庫操作工作線程保持獨立並防止衝突。
程式碼實作:
MainWindow.xaml: 刪除任何在資料庫操作的 BackgroundWorker
中直接更新進度條的嘗試。
專用進度列工作人員:建立一個新類別來管理進度欄更新:
<code class="language-csharp">public class ProgressBarWorker { private ProgressBar progressBar; private BackgroundWorker worker; public ProgressBarWorker(ProgressBar progressBar) { this.progressBar = progressBar; worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.DoWork += Work; worker.ProgressChanged += ProgressChanged; // Added ProgressChanged handler } public void Run() { worker.RunWorkerAsync(); } private void Work(object sender, DoWorkEventArgs e) { // Simulate long-running work; replace with your database operation for (int i = 0; i < 100; i++) { Thread.Sleep(100); // Simulate work worker.ReportProgress(i); // Report progress to the main thread } } private void ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; // Update progress bar on main thread } }</code>
主視窗程式碼(範例): 在您的 UserControl_Loaded
事件中,初始化並啟動 ProgressBarWorker
:
<code class="language-csharp">ProgressBarWorker progressBarWorker = new ProgressBarWorker(progressBar); progressBarWorker.Run();</code>
優點:
以上是使用BackgroundWorkers進行長時間運行的資料庫操作時如何防止UI凍結?的詳細內容。更多資訊請關注PHP中文網其他相關文章!