C#中BackgroundWorker类的用法详解
1.背景介绍
BackgroundWorker
是一个简化多线程编程的组件,一般用来实现后台操作。相比于Thread
类,BackgroundWorker
更加易于使用,而且可以避免许多线程相关的问题。在BackgroundWorker
中,通过DoWork
事件处理程序处理计算任务,并把计算结果通过RunWorkerCompleted
事件处理程序返回给主线程。
2.BackgroundWorker类的重要成员
2.1 DoWork
该事件在后台线程中触发,用于执行长时间运行的计算操作。
2.2 ProgressChanged
该事件在后台线程中触发,通常用于显示实时进度更新。需要调用ReportProgress
方法来激发该事件。
2.3 RunWorkerCompleted
该事件在后台线程执行结束时触发,通常用于对计算结果进行处理或更新UI。
2.4 WorkerReportsProgress
该属性用于指示是否应该在进度更新时激发ProgressChanged
事件。
2.5 WorkerSupportsCancellation
该属性用于指示是否支持取消异步操作。
3.使用BackgroundWorker类的示例
private BackgroundWorker worker = new BackgroundWorker();
private void btnStart_Click(object sender, EventArgs e)
{
// 初始化BackgroundWorker组件
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
// 开始计算
worker.RunWorkerAsync();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
// 模拟长时间运行的计算操作
Thread.Sleep(100);
// 报告进度
if (worker.WorkerReportsProgress)
{
worker.ReportProgress(i + 1);
}
// 取消操作
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
}
// 计算完毕,返回结果
e.Result = "计算结果";
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("操作已取消!");
}
else if (e.Error != null)
{
MessageBox.Show("操作出错:" + e.Error.Message);
}
else
{
MessageBox.Show("操作已完成,结果为:" + e.Result.ToString());
}
}
在上述示例中,当用户点击btnStart
按钮时,会启动一个后台线程,执行worker_DoWork
方法中的计算操作,并且在进度更新时会激发worker_ProgressChanged
方法。当计算完成后,会返回计算结果,并通过worker_RunWorkerCompleted
方法将结果显示在UI界面上。
3.1 示例2:取消异步操作
private BackgroundWorker worker = new BackgroundWorker();
private void btnCancel_Click(object sender, EventArgs e)
{
worker.CancelAsync();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
// 模拟长时间运行的计算操作
Thread.Sleep(100);
// 报告进度
if (worker.WorkerReportsProgress)
{
worker.ReportProgress(i + 1);
}
// 取消操作
if (worker.CancellationPending)
{
e.Cancel = true;
return;
}
}
// 计算完毕,返回结果
e.Result = "计算结果";
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("操作已取消!");
}
else if (e.Error != null)
{
MessageBox.Show("操作出错:" + e.Error.Message);
}
else
{
MessageBox.Show("操作已完成,结果为:" + e.Result.ToString());
}
}
在上述示例中,当用户点击btnCancel
按钮时,会调用worker.CancelAsync()
方法取消异步操作。在执行计算操作时,会不断检查是否需要取消操作worker.CancellationPending
。当该属性值为true
时,会设置DoWorkEventArgs.Cancel
为true
。在worker_RunWorkerCompleted
中检查e.Cancelled
属性来判断操作是否被取消。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中backgroundWorker类的用法详解 - Python技术站