C# 實時更新進度 不卡死介面 BackgroundWorker
阿新 • • 發佈:2022-03-25
一、封裝可重用類
public class Async { protected BackgroundWorker bgWorker = new BackgroundWorker(); /** * 業務方法 */ public static Async DoWork(Action<object?, DoWorkEventArgs> DoWork) { Async async = new(); async.bgWorker.DoWork += newDoWorkEventHandler(DoWork); return async; } /** * 進度狀態 */ public Async ProgressChanged(Action<object?, ProgressChangedEventArgs> ProgessChanged) { bgWorker.WorkerReportsProgress = true; bgWorker.ProgressChanged+= new ProgressChangedEventHandler(ProgessChanged); return this; } /** * 結束狀態 */ public Async RunWorkerCompleted(Action<object?, RunWorkerCompletedEventArgs> WorkerCompleted) { bgWorker.WorkerSupportsCancellation = true; bgWorker.RunWorkerCompleted+= new RunWorkerCompletedEventHandler(WorkerCompleted); return this; } /** * 啟動 */ public BackgroundWorker Start(object? o) { if (bgWorker.IsBusy) return bgWorker; bgWorker.RunWorkerAsync(o); return bgWorker; } }
二、測試
1、不卡死介面測試
private void StartUpdateClick(object sender, RoutedEventArgs e){ bgWorker = Async.DoWork(delegate (object? sender,DoWorkEventArgs e){ for (int i=1;i<=100;i++) {Thread.Sleep(1000);} }).Start(this); }
2、更新進度測試
private BackgroundWorker bgWorker; private void StartClick(object sender, RoutedEventArgs e) { bgWorker = Async.DoWork(delegate (object? sender, DoWorkEventArgs e){ for (int i=1;i<=100;i++) { bgWorker.ReportProgress(i); } }).ProgressChanged(delegate (object? sender, ProgressChangedEventArgs e) { ProgressBarBox.Value = e.ProgressPercentage; }).RunWorkerCompleted(delegate (object? sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show(e.Error.ToString()); return; } if (!e.Cancelled) { FinishBox.Visibility = Visibility.Visible; QuitBox.Visibility = Visibility.Hidden; } else { MessageBox.Show("處理終止!"); } }).Start(this); }