取消操作
  在执行过程中允许用户取消当前的操作是一个基本的设计,BackgroundWorker自然有很好的支持:
  _demoBGWorker.WorkerSupportsCancellation = true;
  和WorkerReportsProgress属性一样,如果要支持取消操作我们需要设置 WorkerSupportsCancellation属性为 true。并且还要在BGWorker_DoWork方法中进行支持,在 for 循环中 Thread.Sleep(600)后面添加代码:
  bgWorker.ReportProgress(i, message);
  Thread.Sleep(600);
  //在操作的过程中需要检查用户是否取消了当前的操作。
  if (bgWorker.CancellationPending == true)
  {
  e.Cancel = true;
  break;
  }
  如果检测到用户点击的取消按钮,退出当前的计算过程。下面是点击取消按钮时要调用的代码:
  _demoBGWorker.CancelAsync();
  现在已经可以支持取消操作了,赶快试试吧!
  异常处理
  如果在计算过程中发生了异常该怎么处理?有没有办法知道计算过程已经结束?当然要有,即便是正常的结束也需要拿到计算的结果。
  _demoBGWorker.RunWorkerCompleted += BGWorker_RunWorkerCompleted;
  private void BGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  {
  //如果用户取消了当前操作关闭窗口。
  if (e.Cancelled)
  {
  this.Close();
  }
  //计算已经结束,需要禁用取消按钮。
  this.btnCancel.Enabled = false;
  //计算过程中的异常会被抓住,在这里可以进行处理。
  if (e.Error != null)
  {
  Type errorType = e.Error.GetType();
  switch (errorType.Name)
  {
  case "ArgumentNullException":
  case "MyException":
  //do something.
  break;
  default:
  //do something.
  break;
  }
  }
  //计算结果信息:e.Result
  //use it do something.
  }
  RunWorkerCompleted 事件处理函数会在DoWork 事件处理函数返回后被调用。通过它我们可以进行一些运算结束后的操作,比如禁用取消按钮,异常处理,结果显示等。
  注意,如果想要拿到 e.Result,您需要在BGWorker_DoWork方法中设置 e.Result属性,如:
  e.Result = sum;
  总结,BackgroundWorker 类功能完善且使用简便,实在是处理异步耗时操作的利器!