基本API介绍 先创建一个BackgroundWorker
var worker= new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true,
};
搭载事件处理程序:
worker.DoWork += BackgroundWorker_DoWork;
BackgroundWorker_DoWork触发的条件:调用 BackgroundWorker.RunWorkerAsync() 时发生
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
_process = 0;
_doWorkEventArgs = e;
switch (Status)
{
case -1: //错误
{
//TODO:在此添加对于异常错误的处理代码
}
break;
case 0: //空闲
{
Status = 1;
//RunService();
try
{
DoMyTask();
}
catch (Exception ex)
{
LogService.WriteErrorLog(ex, "CAXA.MES.ServerBusinessService");
throw ex;
Status = -1;
}
finally
{
GC.Collect();
//强制在此对所有代进行垃圾回收,释放系统资源,防止数据量过大导致程序不稳定
Status = 0;
}
}
break;
case 1: //正在运行
{
//TODO:在此添加程序正在运行时,在此运行时处理代码
Status = 3;
}
break;
case 2: //等待
{
//TODO:在此添加程序等待处理代码
Status = 3;
}
break;
case 3: //正在取消
{
//TODO:在此添加程序取消处理代码
Status = 3;
}
break;
default: //未知
{
//TODO:在此添加未知异常信息处理代码
Status = Int32.MaxValue;
}
break;
}
}
触发以上方法的调用方式:
if (!worker.IsBusy)
worker.RunWorkerAsync();
取消挂起的后台操作方法:
if (worker.IsBusy)
worker.CancelAsync();
再注册两个报告进度的事件:
//BackgroundWorker.ReportProgress(System.Int32) 时发生
worker.ProgressChanged += progressChanged;
//当后台操作已完成、被取消或引发异常时发生
worker.RunWorkerCompleted += runWorkerCompleted;
Demo
/// <summary>
/// Asyn
/// </summary>
public class Asyn
{
#region 构造函数
public Asyn()
{
Worker = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true,
};
Worker.DoWork +=worker_DoWork;
}
#endregion
#region 属性字段
public BackgroundWorker Worker { get; private set; }
public const int LoopCount = 100;
public static int CurProcessVal = 0;
#endregion
#region 私有方法
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
while (CurProcessVal++ < LoopCount)
{
if (Worker.CancellationPending) //如果执行停止操作变为true
{
e.Cancel = true;
break;
}
Thread.Sleep(100);
Worker.ReportProgress(CurProcessVal);
}
}
#endregion
#region 公有方法
public void Start()
{
if (!Worker.IsBusy)
Worker.RunWorkerAsync();
}
public void Stop()
{
if (Worker.IsBusy)
{
Worker.CancelAsync();
}
}
#endregion
}
调用:
public partial class Form1 : Form
{
private Asyn _asyn;
public Form1()
{
InitializeComponent();
_asyn = new Asyn();
_asyn.Worker.ProgressChanged += worker_ProgressChanged;
_asyn.Worker.RunWorkerCompleted += worker_RunWorkerCompleted;
bar.Maximum = Asyn.LoopCount;
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
bar.ProgressBar.Invoke(new Action(() => bar.Value = e.ProgressPercentage));
statusLabel.Text = string.Format("正在处理...({0}/{1})", e.ProgressPercentage, Asyn.LoopCount);
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
bar.ProgressBar.Invoke(new Action(() => bar.Value = Asyn.LoopCount));
if (e.Cancelled)
{
statusLabel.Text = "处理已停止";
bar.ProgressBar.Invoke(new Action(() => bar.Value = Asyn.CurProcessVal));
}
else
{
statusLabel.Text = "处理完成";
}
}
private void button1_Click(object sender, EventArgs e)
{
_asyn.Start();
}
private void button2_Click(object sender, EventArgs e)
{
_asyn.Stop();
}
}
结果预览: