C# BackgroundWorker 后台异步组件
				
									
					
					
						|  | 
							admin 2024年1月13日 17:10
								本文热度 1938 | 
					
				 
				摘要
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 编辑过