BackgroundWorker是基于事件异步模式的一个实现。它具有以下特征:
可协调的退出
安全的更新窗体控件
转发异常到完成事件
报告进度
是一个控件,可以在visual studio中直接拖拽使用
由于BackgroundWorker是在线程池上运行,所有不能调用Abort()方法。
主要有3个事件,注意事件发生的时间
DoWork | 调用 RunWorkerAsync 时发生。 | |
ProgressChanged | 调用 ReportProgress 时发生。 | |
RunWorkerCompleted | 当后台操作已完成、被取消或引发异常时发生。 |
private void Form3_Load(object sender, EventArgs e)
{
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < progressBar1.Maximum; i++)
{
if (backgroundWorker1.CancellationPending)//每次循环检查取消状态
{
e.Cancel = true;
return;
}
if (i > 78)
throw new Exception("error"); //抛出的异常会在completed事件中捕获
//dothing(); //无论间接还是直接调用windowsUI控件,在调试状态时会引发异常,但是在执行时却不引发异常。
Thread.Sleep(100);
backgroundWorker1.ReportProgress(i);//更新状态。
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value++;//此处可以更新UI
textBox1.AppendText("Call ProgressChanged:" + e.ProgressPercentage + ((BackgroundWorker)sender).IsBusy + "\r\n");
throw new Exception("error in ProgressChanged"); //此处抛出的异常不会被completed事件捕获
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
MessageBox.Show("You canceled!");
else if (e.Error != null)
MessageBox.Show("Worker exception: " + e.Error.Message);
else
MessageBox.Show("OK!");
}
private void btnStart_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();//执行该事件
}
private void btnCancel_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();//取消
}
private void dothing()
{
textBox1.AppendText("-------------\r\n");
}
本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/533207,如需转载请自行联系原作者