一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能.     
 BackgroundWorker类允许您在单独的专用线程上运行操作。  耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。
  如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker类方便地解决问题(MSDN)。 
        若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。  可以通过编程方式创建 BackgroundWorker,
  也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。  如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中(MSDN)。
属性: 
   IsBusy:获取一个值,指示 BackgroundWorker 是否正在运行异步操作。
   WorkerReportsProgress:获取或设置一个值,该值指示 BackgroundWorker 能否报告进度更新。
   WorkerSupportsCancellation:获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。
事件:
DoWork:调用 RunWorkerAsync 时发生。
ProgressChanged:调用 ReportProgress 时发生。
RunWorkerCompleted:当后台操作已完成、被取消或引发异常时发生。
实例:
 窗体设计如下图:

代码实现:
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
        public Form1() 
        { 
            InitializeComponent(); 
            backgroundWorker1.WorkerReportsProgress = true; 
            backgroundWorker1.WorkerSupportsCancellation = true; 
        } 
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
        { 
            BackgroundWorker worker = sender as BackgroundWorker; 
            for (int i = 1; i <= 12; i++) 
            { 
                if (worker.CancellationPending == true) 
                { 
                    e.Cancel = true; 
                    break; 
                } 
                else
                { 
                    System.Threading.Thread.Sleep(500); 
                    worker.ReportProgress(i * 10); 
                } 
            } 
        } 
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
        { 
            lbResult.Text = (e.ProgressPercentage.ToString() + "%"+e.UserState); 
        } 
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
        { 
            if (e.Cancelled == true) 
            { 
                lbResult.Text = "Canceled!"; 
            } 
            else if (e.Error != null) 
            { 
                lbResult.Text = "Error: " + e.Error.Message; 
            } 
            else
            { 
                lbResult.Text = "Done!"; 
            } 
        } 
        private void btnStartAsync_Click(object sender, EventArgs e) 
        { 
            if (backgroundWorker1.IsBusy != true) 
            { 
                backgroundWorker1.RunWorkerAsync(); 
            } 
        } 
        private void btnCancelAsync_Click(object sender, EventArgs e) 
        { 
            if (backgroundWorker1.WorkerSupportsCancellation == true) 
            { 
                backgroundWorker1.CancelAsync(); 
            } 
        } 
    } 
}
运行结果: 


