c# BackgroundWorker使用方法

2020-06-08 16:00:55王振洲

      3. BackgroundWorker.CancelAsync——但需要退出异步调用的时候,就调用的这个方法。但是样还不够,因为它仅仅是将BackgroudWorker.CancellationPending属性设置为true。你需要在具体的异步调用处理的时候,不断检查BackgroudWorker.CancellationPending是否为true,如果是真的话就退出。(注意:只有在BackgroundWorker.WorkerSupportsCancellation属性被设置为true该方法才可用)。

BackgroundWorker组件

重要属性:

    1、CancellationPending         获取一个值,指示应用程序是否已请求取消后台操作。通过在DoWork事件中判断CancellationPending属性可以认定是否需要取消后台操作(也就是结束线程);

    2、 WorkerReportsProgress :获取或设置一个值,该值指示BackgroundWorker能否报告进度更新

重要方法:

    1、CancelAsync         请求取消挂起的后台操作

    2、RunWorkerAsync      开始执行后台操作

    3、ReportProgress      引发ProgressChanged事件 

重要事件:  

    1、DoWork              调用 RunWorkerAsync 时发生

    2、ProgressChanged     调用 ReportProgress 时发生

    3、RunWorkerCompleted  当后台操作已完成、被取消或引发异常时发生

    另外还有三个重要的参数是RunWorkerCompletedEventArgs以及DoWorkEventArgs、ProgressChangedEventArgs。

例子:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Delegate3
{
  public partial class Form1 : Form
  {

    public Form1()
    {
      InitializeComponent();
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
      //启动异步调用方法
      //调用RunWorkerAsync()方法,会触发DoWork事件
      this.backgroundWorker2.RunWorkerAsync();
    }

    private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
    {
      backgroundWorker2.WorkerReportsProgress = true;
      for (int i = 1; i <= 100; i++)
      {
        //这里判断一下是否用户要求取消后台进行,并可以尽早退出。
        //可以通过调用CancelAsync方法设置CancellationPending的值为false
        if (backgroundWorker2.CancellationPending)
        {
          backgroundWorker2.ReportProgress(i, String.Format("{0}%,操作被用户申请中断", i));
        }

        //调用 ReportProgress 方法,会触发ProgressChanged事件
        backgroundWorker2.ReportProgress(i, String.Format("{0}%", i));
        System.Threading.Thread.Sleep(10);
      }
    }

    private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
      this.progressBar1.Value = e.ProgressPercentage;
      this.label1.Text = e.UserState.ToString();
      this.label1.Update();
    }

    private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      //这是结束后做的事情
      MessageBox.Show("完成");
    }
  }
}