C#中BackgroundWorker的介绍

BackgroundWorker可以解决执行耗时操作界面无法响应的问题,另外也提供异步操作取消以及下载进度报告等;它常用的属性有:

(1).CancellationPending属性,用来指示应用程序是否已请求取消后台操作;

(2).IsBusy属性,指示异步操作是否正在运行;

(3).WorkReportsProgress属性,指示Backgroundworker能否报告进度;

(4).WorkerSupportsCancellation属性,指示Backgroundworker是否支持异步取消操作。

常用方法有:

(1).public void CancelAsync():请求取消挂起的后台操作;

(2).public void RunWorkerAsync():开始执行后台操作(不带参数);

(3).public void RunWorkerAsync(object argument):开始执行后台操作(带参数);

(4).public void ReportProgress(int percentProgress):用于引发ProgressChanged事件。

下面是完整示例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace BackGroundWorker
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        BackgroundWorker worker = null;
        public MainWindow()
        {
            InitializeComponent();
            worker = new BackgroundWorker();
        }

        private void MyDoWork(object sender, DoWorkEventArgs e)
        {
            for(int i = 0; i <= 100; i++)
            {
                worker.ReportProgress(i);
                Thread.Sleep(2000);
                //如果检测到点击了取消按钮,则退出当前循环
                if (true == worker.CancellationPending)
                {
                    e.Cancel = true;
                    break;
                }
            }
        }

        private void MyDoWork1(object sender, DoWorkEventArgs e)
        {
            int number = 0;
            if(e != null)
            {
                number = (int)e.Argument;
            }
            for (int i = 0; i <= 100; i++)
            {
                worker.ReportProgress(i);
                Thread.Sleep(2000);
                //如果检测到点击了取消按钮,则退出当前循环
                if(true == worker.CancellationPending)
                {
                    e.Cancel = true;
                    break;
                }
            }
        }

        //当后台操作已完成、被取消或引发异常时发生
        private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            btn_start.IsEnabled = false;
            btn_start1.IsEnabled = false;
            btn_cancel.IsEnabled = false;
        }

        private void Backchanged(object sender, ProgressChangedEventArgs e)
        {
            this.proBar.Value = e.ProgressPercentage;
        }

        private void btn_start_Click(object sender, RoutedEventArgs e)
        {
            //如果支持取消,则为true;否则为false。 默认值为false。
            worker.WorkerSupportsCancellation = true;
            //支持进度更新,则为 true;否则为 false。
            worker.WorkerReportsProgress = true;
            //调用 RunWorkerAsync()时发生
            worker.DoWork += new DoWorkEventHandler(MyDoWork);
            //调用 ReportProgress(System.Int32)时发生
            worker.ProgressChanged += new ProgressChangedEventHandler(Backchanged);
            //当后台操作已完成、被取消或引发异常时发生
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);
            if(!worker.IsBusy)
            {
                //开始执行后台操作
                worker.RunWorkerAsync();
            }           
        }

        private void btn_start1_Click(object sender, RoutedEventArgs e)
        {
            //如果支持取消,则为true;否则为false。 默认值为false。
            worker.WorkerSupportsCancellation = true;
            //支持进度更新,则为 true;否则为 false。
            worker.WorkerReportsProgress = true;
            //调用 RunWorkerAsync()时发生
            worker.DoWork += new DoWorkEventHandler(MyDoWork1);
            //调用 ReportProgress(System.Int32)时发生
            worker.ProgressChanged += new ProgressChangedEventHandler(Backchanged);
            if(!worker.IsBusy)
            {
                //开始执行后台操作
                worker.RunWorkerAsync(100);
            }         
        }

        private void btn_cancel_Click(object sender, RoutedEventArgs e)
        {
            if (worker.IsBusy && worker.WorkerSupportsCancellation)
            {
                //请求取消挂起的后台操作
                worker.CancelAsync();
            }          
        }
    }
}

演示效果如下:

C#中BackgroundWorker的介绍