BackgroundWorker学习笔记

1 简介

BackgroundWorker 类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。 如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

2 使用BackgroundWork

  • 若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。 可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”“组件”选项卡中拖到窗体上。 如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。
  • 若要为后台操作做好准备,请添加 DoWork 事件的事件处理程序。 在此事件处理程序中调用耗时的操作。
  • 若要开始此操作,请调用 RunWorkerAsync
  • 若要收到进度更新的通知,请处理 ProgressChanged 事件。
  • 若要在操作完成时收到通知,请处理 RunWorkerCompleted 事件。

3 创建使用

           BackgroundWorker bw = new BackgroundWorker();//后台进程
           bw.DoWork += new DoWorkEventHandler(bw_DoWork);//bw_DoWork这里将执行一些耗时操作
           bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);//操作完成后执行的事件
           bw.RunWorkerAsync();//可以带参数,参数可选

          void bw_DoWork(object sender, DoWorkEventArgs e)
         {耗时操作,e是可选的事件参数}

4 显示后台操作进度

    为了显示后台操作的执行进度,首先要使WorkerReportsProgress 等于true,然后调用BackgroundWorker的ReportProgress()方法,通过它传递操作完成的进度值,此外,该方法触发ProgressChanged事件,在是此事件中,通过ProgressChangedEventArgs的实例,接收到主线程传递过来的参数。
BackgroundWorker backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.WorkerReportsProgress = true;
private void btnStart_Click(object sender, EventArgs e) 

{ 

      backgroundWorker1.RunWokerAsync(); 

} 

private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e) 

{ 

      for (int i = 1; i < 11; i++) 

     { 

              Thread.Sleep(2000); 

             backgroundWorker1.ReportProgress(i*10); 

     } 

} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{ 

      //progressBar1是ProgressBar控件 

      progressBar1.Value = e.ProgressPercentage; 
}

5 取消后台操作

     为了使 BackgroundWorker 可以取消后台正在执行的操作,首先要把属性WorkerSupportsCancellation 的值设置为 true。接着调用CancelAsync()方法,该方法使得属性CancellationPending 为true,利用CancellationPending 属性,可以判断是否取消后台异步操作。

BackgroundWorker backgroundWorker1 = new BackgroundWorker(); 

backgroundWorker1.WorkerReportsProgress = true;


backgroundWorker1.WorkerSupportsCancellation = true;

          

private void btnCancel_Click(object sender, EventArgs e) 

{ 

      backgroundWorker1.CancelAsync(); 

}
if(backgroundWorker1.CancellationPending) 

 { 

    e.Cancel = true; 

     return; 

 }
原文地址:https://www.cnblogs.com/fuchongjundream/p/3937181.html