C#使用后台线程BackgroundWorker处理任务的总结

2020-01-05 09:11:40王振洲


public partial class MainFrame : BaseForm
  {
    /// <summary>
    /// 增加一个变量来记录线程状态
    /// </summary>
    private bool IsThreadRunning = false;
    private BackgroundWorker worker = new BackgroundWorker();

    public MainFrame()
    {
      InitializeComponent();

      Portal.gc.InitData();

      worker.WorkerSupportsCancellation = true;  //支持取消
      worker.WorkerReportsProgress = true;    //支持报告进度
      worker.DoWork += worker_DoWork;       //处理过程
      worker.RunWorkerCompleted += worker_RunWorkerCompleted; //完成操作
      worker.ProgressChanged += worker_ProgressChanged;    //报告进度
    }

例如进度条的通知,主要就是计算总任务的数量,以及当前完成的人数数量,我们实现代码如下所示


/// <summary>
    /// 进度条的通知
    /// </summary>
    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
      this.barProgress.EditValue = e.ProgressPercentage;
      CollectStateInfo stateInfo = e.UserState as CollectStateInfo;
      if (stateInfo != null)
      {
        var message = string.Format("正在采集 {0} 的 {1} , 项目名称为:{2}", stateInfo.TotalRecords, stateInfo.CompletedRecord + 1, stateInfo.CurrentItemName);
        this.lblTips.Text = message;
        this.barTips.Caption = message;

        //记录运行位置
        JobParameterHelper.SaveData(new CurrentJobParameter(stateInfo));
      }
    }

这里我们看到了,这个里面使用了一个自定义的状态参数CollectStateInfo ,这个是我们用来在后台进程处理过程中传递的一个对象,可以记录当前采集的相关信息,CollectStateInfo 类的定义如下所示。


/// <summary>
  /// 状态对象数据
  /// </summary>
  public class CollectStateInfo
  {
    /// <summary>
    /// 当前期数(年份+期数)
    /// </summary>
    public string YearQSNumber { get; set; }

    /// <summary>
    /// 任务开始时间
    /// </summary>
    public DateTime StartTime { get; set; }

    private DateTime m_EndTime = DateTime.Now;

    /// <summary>
    /// 任务开始时间
    /// </summary>
    public DateTime EndTime
    {
      get
      {
        return m_EndTime;
      }
      set
      {
        //设置结束时间的时候,获取耗时
        m_EndTime = value;
        this.TimeSpanUsed = value.Subtract(this.StartTime);
      }
    }

    /// <summary>
    /// 任务用时
    /// </summary>
    public TimeSpan TimeSpanUsed { get; set; }

    /// <summary>
    /// 任务数量
    /// </summary>
    public int TotalRecords { get; set; }

    private int m_CompletedRecord = 0;

    /// <summary>
    /// 完成数量
    /// </summary>
    public int CompletedRecord
    {
      get
      {
        return m_CompletedRecord;
      }
      set
      {
        m_CompletedRecord = value;
        if (TotalRecords > 0)
        {
          this.CurrentProgress = Convert.ToInt32(value * 100.0 / TotalRecords);
        }
      }
    }

    /// <summary>
    /// 当前进度
    /// </summary>
    public int CurrentProgress { get; set; }

    /// <summary>
    /// 当前采集的项目
    /// </summary>
    public string CurrentItemName { get; set; }

    /// <summary>
    /// 默认构造函数
    /// </summary>
    /// <param name="total"></param>
    public CollectStateInfo()
    {
      this.StartTime = DateTime.Now;
      this.EndTime = DateTime.Now;
    }

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="total">任务数量</param>
    /// <param name="qsNumber">采集当前期数</param>
    public CollectStateInfo(int total, string qsNumber, int completed) :this()
    {
      this.TotalRecords = total;
      this.YearQSNumber = qsNumber;
      this.CompletedRecord = completed;
    }

  }