C# BackgroundWorker的使用

本文介绍如何使用BackgroundWorker组件执行后台任务,包括启动后台线程、显示进度、取消操作及完成后的处理。


前言


  当应用程序执耗时任务时,长时间的运行可能会导致程序界面处于停止响应状态,造

成较差的用户体验,如果需要程序在执行任务的同时,又能够响应用户操作,则使用

BackgroundWorker组件是一个较好的解决办法。同时BackgroundWorker 组件用来执

诸如数据库事务、文件下载等耗时的异步操作,可用于启动后台线程

1)DoWork:是BackgroupWorker的核心,异步操作的主体是在接受的函数里面完成,


      注意不要涉及UI操作,在RunWorkerAsync()函数调用的时候发生。


2)RunWorkerCompleted:当后台操作已完成,被终止或者引起异常的时候发生。


3)ProgressChanged:当调用ReportProgress()函数的时候会触发,主要负责UI的更新。

注意:DoWork事件是在后台线程中运行的,所以在该事件中不能够操作用户界面的内容,如果需要更新用户界

面,可以使用ProgressChanged事件及RunWorkCompleted事件来实现

参考链接: 点击打开链接

开始

在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接

拖到应用程序:

 
  
 
BackgroundWorker backgroundWorker1  =  new  BackgroundWorker();

为了开始在后台操作,必须调用BackgroundWorker的RunWorkerAsync()方法,当

调用此方时,BackgroundWorker 通过触发DoWork 事件,开始执行后台操作,

DoWork 事件的代码是在另一个线程里执行的。

   eg:

         

BackgroundWorker backgroundWorker1 = new BackgroundWorker();

//在另一个线程里开始操作(btnStart是一个按钮控件)

//也可以利用RunWokerAsync()方法传递参数,

private void btnStart_Click(object sender, EventArgs e)

{

          backgroundWorker1.RunWokerAsync(2000/*参数是可选的*/);

}

//DoWork事件在另一个线程里执行

private void backgroundWorker1_DoWork(objectsender,DoWorkeventArgs e)

{

        //允许长时间的操作

        int input = (int)e.Argument;

        Thread.Sleep(input);

}


显示后台操作进度

     为了显示后台操作的执行进度,首先要使WorkerReportsProgress 等于true,后调用BackgroundWorker的

ReportProgress()方法,通过它传递操作完成的进度值,此外,该方法触发ProgressChanged事件,在是此事件

中,通过ProgressChangedEventArgs的实例,接收到主线程传递过来的参数。


      eg:


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;

}

取消后台操作

      为了使 BackgroundWorker 可以取消后台正在执行的操作,首先要把属性

WorkerSupportsCancellation 的值设置为 true。接着调用CancelAsync()方法,该方法使得属性

CancellationPending 为true,利用CancellationPending 属性,可以判断是否取消后台异步操作。


eg:


 

BackgroundWorker backgroundWorker1 = new BackgroundWorker();

backgroundWorker1.WorkerReportsProgress = true;

backgroundWorker1.WorkerSupportsCancellation = true;

private void btnStart_Click(object sender, EventArgs e)

{

       backgroundWorker1.RunWokerAsync();

}

private void btnCancel_Click(object sender, EventArgs e)

{

      backgroundWorker1.CancelAsync();

}

private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)

{

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

     {

             Thread.Sleep(2000);

             backgroundWorker1.ReportProgress(i*10);

            if(backgroundWorker1.CancellationPending)

            {

                   e.Cancel = true;

                   return;

             }

      }

}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

         progressBar1.Value = e.ProgressPercentage;

}

后台操作完成后,反馈给用户

    当后台操作完成以后,无论是completed 还是cancelled,则RunWorkerCompleted 事件被触

发,通过此方法可以将后台操作的完成结果反馈给用户;另外,通RunWorkerCompletedEventArgs

实例的Cancelled 属性,以判断是否是Cancel操作使得后台操作终止;

eg:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

if(e.Cancelled)

{

       MessageBox.Show("Operation Cancelled");

}

else

{

       MessageBox.Show("OperationCompleted");

}

}


       从后台操作返回值

        在执行DoWork 事件时,DoWorkEventArgs 实例的Result 属性,返回值到用户;在

   RunWorkerCompleted 事件里,RunWorkerCompletedEventArgs 实例的Result 属性接收值;

    eg:

private void backgroundWorker1_DoWork(object sender, DoWorkeventArgs e)

{

Thread.Sleep(2000);

//在此处设置返回值

e.Result = 10;

}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

//在此处接收传递回来的值

int returnValue = (int)e.Result;

}

 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值