1. 程式人生 > 其它 >C# 實時更新進度 不卡死介面 BackgroundWorker

C# 實時更新進度 不卡死介面 BackgroundWorker

一、封裝可重用類

   public class Async
    {
        protected BackgroundWorker bgWorker = new BackgroundWorker();
        /**
         * 業務方法
         */
        public static Async DoWork(Action<object?, DoWorkEventArgs> DoWork) {
            Async async = new();
            async.bgWorker.DoWork += new
DoWorkEventHandler(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);
        }