C# BackgroundWorker 后台异步组件
|
admin
2024年1月13日 17:10
本文热度 534
|
摘要
BackgroundWorker 是一个重要的 Windows 应用程序开发组件,它允许你在后台执行耗时的操作,而不会阻塞应用程序的主 UI 线程。通过使用 BackgroundWorker,你可以使你的应用程序更加灵活,更加高效。
BackgroundWorker 组件是通过委托和异步编程技术实现的。你可以在组件的主类中定义一个辅助方法,该方法会在后台执行,同时不会阻塞调用线程。这些辅助方法是异步的,因此它们不会阻塞 UI 线程。相反,调用线程可以继续执行其他任务,直到异步方法完成。
一旦你定义了一个辅助方法,你可以使用 RunWorkerAsync 方法将其作为异步任务提交给 BackgroundWorker。在调用该方法时,BackgroundWorker 将创建一个线程池线程来执行辅助方法。在辅助方法运行时,调用线程将继续执行其他任务,而不会阻塞。
当辅助方法完成时,BackgroundWorker 将引发一个事件。这个事件是可选的,但它可以包含有关辅助方法运行的信息,例如耗时,状态和错误消息。如果你不需要事件,你可以使用 RunWorkerCompleted 方法立即结束任务。
BackgroundWorker 是一个非常有用的组件,它可以帮助你编写高效的异步代码。它使你能够在后台执行耗时的操作,而不会阻塞 UI 线程,这对于实现响应式和流畅的应用程序非常重要。无论你是编写 Web 应用程序,移动应用程序还是桌面应用程序,BackgroundWorker 都是一个值得使用的工具。
正文
属性
|
|
---|
CancellationPending | 获取一个值,指示应用程序是否已请求取消后台操作。 |
CanRaiseEvents | 获取一个指示组件是否可以引发事件的值。 |
Events | 获取附加到此 Component 的事件处理程序的列表。 |
IsBusy | 获取一个值,指示 BackgroundWorker 是否正在运行异步操作。 |
WorkerReportsProgress | 获取或设置一个值,该值指示 BackgroundWorker 能否报告进度更新。 |
WorkerSupportsCancellation | 获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。 |
方法
|
|
---|
CancelAsync() | 请求取消挂起的后台操作。 |
OnDoWork(DoWorkEventArgs) | 引发 DoWork 事件。 |
OnProgressChanged(ProgressChangedEventArgs) | 引发 ProgressChanged 事件。 |
OnRunWorkerCompleted(RunWorkerCompletedEventArgs) | 引发 RunWorkerCompleted 事件。 |
ReportProgress(Int32) | 引发 ProgressChanged 事件。 |
ReportProgress(Int32, Object) | 引发 ProgressChanged 事件。 |
RunWorkerAsync() | 开始执行后台操作。 |
RunWorkerAsync(Object) | 开始执行后台操作。 |
实例化
//实例化BackgroundWorker
private BackgroundWorker bgWorker = new BackgroundWorker();
初使化
private void FrmMain_Load(object sender, EventArgs e)
{
pbar.Maximum = 1000;
//是否报告处理进度
bgWorker.WorkerReportsProgress = true;
//是否允许取消操作
bgWorker.WorkerSupportsCancellation = true;
//执行三个事件,DoWork事件,ProgressChanged事件以及RunWorkedCompleted事件
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);
bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);
}
事件
public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
//设置进度条Maximum为1000,循环1000次
for (int i = 0; i <= 1000; i++)
{
//获取是否取消操作
if (bgWorker.CancellationPending)
{
e.Cancel = true;
return;
}
else
{
//报告进度
bgWorker.ReportProgress(i, "Working");
System.Threading.Thread.Sleep(10);
}
}
}
public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e)
{
//e.ProgressPercentage是获取任务int类型
pbar.Value = e.ProgressPercentage;
lblTitle.Text = "处理进度:" + Convert.ToString(e.ProgressPercentage);
}
public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//若没有完全执行结束,则报错
if (e.Error != null)
{
MessageBox.Show(e.Error.ToString());
return;
}
if (!e.Cancelled)
this.lblTitle.Text = "处理完毕!";
else
this.lblTitle.Text = "处理终止!";
}
//开始
private void btnStart_Click(object sender, EventArgs e)
{
//正忙时不允许继续操作
if (bgWorker.IsBusy)
return;
//异步开启
bgWorker.RunWorkerAsync("start");
}
//停止
private void btnStop_Click(object sender, EventArgs e)
{
bgWorker.CancelAsync();
}
该文章在 2024/1/13 17:10:02 编辑过