上面的对象,主要用来记录任务的总数,以及当前进行的数量,还包括一些其他信息,如任务的开始时间,结束时间等等,我们可以把一些常规的任务信息,放到这里面来传递即可。
另一个后台进程处理的关键事件就是处理过程的代码实现,主要就是采集处理的逻辑内容,如下所示。
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;
}










