문제:
장기 실행되는 데이터베이스 작업으로 인해 기본 애플리케이션 창이 정지되어 진행률 표시줄이 응답하지 않게 될 수 있습니다. 이는 데이터베이스 작업이 기본 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>
MainWindow 코드(예): UserControl_Loaded
이벤트에서 ProgressBarWorker
:
<code class="language-csharp">ProgressBarWorker progressBarWorker = new ProgressBarWorker(progressBar); progressBarWorker.Run();</code>
장점:
위 내용은 장기 실행 데이터베이스 작업에 BackgroundWorker를 사용할 때 UI 정지를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!