基本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:
{
}
break;
case 0:
{
Status =
1;
try
{
DoMyTask();
}
catch (Exception ex)
{
LogService.WriteErrorLog(ex,
"CAXA.MES.ServerBusinessService");
throw ex;
Status = -
1;
}
finally
{
GC.Collect();
Status =
0;
}
}
break;
case 1:
{
Status =
3;
}
break;
case 2:
{
Status =
3;
}
break;
case 3:
{
Status =
3;
}
break;
default:
{
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
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)
{
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();
}
}
结果预览:
源码下载: http://download.csdn.net/detail/daigualu/9834563