C# BackgroundWorker 后台异步组件
|
admin
2024年1月13日 17:10
本文热度 1921
|
摘要
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) | 开始执行后台操作。 |

实例化
//实例化BackgroundWorkerprivate 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 编辑过