// 新建BackgroundWorker实例
backgroundCalculator = new BackgroundWorker();
// 设置可以通知工作进度
backgroundCalculator.WorkerReportsProgress = true;
// 支持取消工作
backgroundCalculator.WorkerSupportsCancellation = true;
// 定义工作线程的方法
backgroundCalculator.DoWork += new DoWorkEventHandler(backgroundCalculator_DoWork);
// 定义通知进度的方法
backgroundCalculator.ProgressChanged += new ProgressChangedEventHandler(backgroundCalculator_ProgressChanged);
// 定义工作完成的方法,一共有三种情况
// 1. 工作成功完成
// 2. 工作发生错误,失败
// 3. 用户
backgroundCalculator.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundCalculator_RunWorkerCompleted);
backgroundCalculator.RunWorkerAsync(参数); // 开始工作,参数传递到执行工作的方法:
void backgroundCalculator_DoWork(object sender, DoWorkEventArgs e)
{
int start = (int) e.Argument; // 获取参数
e.Result = getNextPrimeAsync(start, (BackgroundWorker)sender, e); // 返回工作结果到e(示例是取得下一个素数)
}
private int getNextPrimeAsync(int start, BackgroundWorker worker, DoWorkEventArgs e)
{
int percentComplete = 0;
start++;
while (!isPrime(start))
{
if (worker.CancellationPending) //如果被取消(使用backgroundCalculator.CancelAsync()取消)
{
e.Cancel = true; // 设置该工作被取消
break;
}
else
{
start++;
percentComplete++;
worker.ReportProgress(percentComplete % 100); //通知工作进度,传递参数到ProgressChangedEventArgs的ProgressPercentage量,并执行后面的变更进度方法
}
}
return start;
}
void backgroundCalculator_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
updateProgress(e.ProgressPercentage); //变更进度条的进度,使用上面传递的参数
}
void backgroundCalculator_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{ //方法执行完成,判断工作是否成功完成并执行相应方法
if (e.Cancelled)
{
updateStatus("Cancelled.");
}
else if (e.Error != null)
{
reportError(e.Error);
}
else
{
reportPrime((int)e.Result);
}
calcProgress.Value = 0;
}
总结:
BackgroundWorker使用起来很简单,比起直接新建一个线程来执行工作要方便很多,主要是它各种EventArgs的参数传递使得多线程编程特别简单方便