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

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

上面的对象,主要用来记录任务的总数,以及当前进行的数量,还包括一些其他信息,如任务的开始时间,结束时间等等,我们可以把一些常规的任务信息,放到这里面来传递即可。

另一个后台进程处理的关键事件就是处理过程的代码实现,主要就是采集处理的逻辑内容,如下所示。


void worker_DoWork(object sender, DoWorkEventArgs e)
    {
      CollectStateInfo info = e.Argument as CollectStateInfo;
      if (info != null)
      {
        LinkJob job = new LinkJob();
        var stateInfo = job.Execute(this.worker, info);
        e.Result = stateInfo;
      }
    }

这个里面我么主要到它的e.Argument 就是我们传递的对象,通过类型转换我们就可以获得对应的信息,然后进行具体的处理了。

另外一个就是当整个后台进程完成处理后,我们需要进行相关的提示和状态处理,实现代码如下所示。


void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      //还原按钮状态
      InitCollectState();
      IsThreadRunning = false;

      string message = "采集操作完成";
      CollectStateInfo stateInfo = e.Result as CollectStateInfo;
      if (stateInfo != null && stateInfo.CompletedRecord == stateInfo.TotalRecords)
      {
        message += string.Format(",完成采集网址{0}个,耗时为:{1}分钟{2}秒。", stateInfo.TotalRecords, stateInfo.TimeSpanUsed.Minutes, stateInfo.TimeSpanUsed.Seconds);

        //清空数据即可
        JobParameterHelper.ClearData();
      }
      else
      {
        message += string.Format(",用户取消处理,耗时为:{1}分钟{2}秒。", stateInfo.TotalRecords, stateInfo.TimeSpanUsed.Minutes, stateInfo.TimeSpanUsed.Seconds);
      }
      MessageDxUtil.ShowTips(message);
    }

而我们开始任务,则通过按钮触发后台线程的异步接口调用即可,如下代码所示。


if (!worker.IsBusy)
        {
          this.btnStartCollect.ImageOptions.Image = Resources.Button_Stop;
          this.lblTips.Text = "数据采集中....,单击按钮可停止采集";
          this.btnStartCollect.Text = "停止采集";

          var totalCount = BLLFactory<URLLink>.Instance.GetRecordCount();//数量为总数
          var stateInfo = new CollectStateInfo(totalCount, yearQSNumber, skipCount);

          worker.RunWorkerAsync(stateInfo);
          //改变状态
          IsThreadRunning = !IsThreadRunning;
        }