Masalahnya:
Operasi pangkalan data yang berjalan lama boleh membekukan tetingkap aplikasi utama anda, menyebabkan bar kemajuan tidak bertindak balas. Ini berlaku kerana tugas pangkalan data menyekat urutan UI utama.
Pekerja Latar Belakang dan Multithreading:
Kelas BackgroundWorker
menawarkan penyelesaian dengan memunggah tugas yang panjang ke urutan yang berasingan, mengekalkan tindak balas UI. Walau bagaimanapun, mengurus kemas kini UI dengan betul daripada urutan latar belakang ini adalah penting.
Mengemas kini UI Dengan Selamat:
Mengubah suai elemen UI memerlukan penggunaan penghantar utas utama. Mengemas kini kawalan UI secara langsung daripada urutan latar belakang adalah tidak selamat dan akan membawa kepada ralat.
Penyelesaian:
Untuk menyelesaikan isu pembekuan, gunakan BackgroundWorker
khusus semata-mata untuk kemas kini bar kemajuan. Ini memastikan pekerja operasi pangkalan data berasingan dan mengelakkan konflik.
Pelaksanaan Kod:
MainWindow.xaml: Alih keluar sebarang percubaan untuk mengemas kini terus bar kemajuan dalam operasi pangkalan data BackgroundWorker
.
Pekerja Bar Kemajuan Khusus: Cipta kelas baharu untuk mengurus kemas kini bar kemajuan:
<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>
Kod Tetingkap Utama (Contoh): Dalam acara UserControl_Loaded
anda, mulakan dan mulakan ProgressBarWorker
:
<code class="language-csharp">ProgressBarWorker progressBarWorker = new ProgressBarWorker(progressBar); progressBarWorker.Run();</code>
Kelebihan:
Atas ialah kandungan terperinci Bagaimana untuk Mencegah UI Membeku Apabila Menggunakan BackgroundWorkers untuk Operasi Pangkalan Data Berlangsung Lama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!