日期:2014-05-18  浏览次数:20876 次

C# BackgroundWorker的使用

此方法可以实现后台程序调用、创建线程、遮屏的效果。

BackgroundWorker主要有三个事件:RunWorkerCompleted,ProgressChanged,DoWork

	      this.backgroundWorker1.RunWorkerCompleted+=new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);

	      this.backgroundWorker1.ProgressChanged+=new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

	      this.backgroundWorker1.DoWork+=new DoWorkEventHandler(backgroundWorker1_DoWork);


当点击一个按钮想实现读条的方法时,需要调用BackgroundWorker对象的RunWorkerAsync方法,该方法会触发DoWork事件,该事件的方法中

可以用两种方式获得BackgroundWorker对象,

	private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

	        {

	            BackgroundWorker worker = (BackgroundWorker)sender;

<
	

        }

或者 直接可以获得类中的BackgroundWorker,在DoWork方法中主要是读条处理的细节方面,通过BackgroundWorker 对象的ReportProgress把百分数传出,

for循环中最大值是100可以表示为百分数的分母,与progressBar的Maximum的属性保持一致。此处还要注意的是,要加上 Thread.Sleep(100),否则线程一直执行,主面板其他控件则无法使用, 也就无法取消当前线程。在每次循环中,一定要校验下CancellationPending是否为真,表示当前线程是否被用户中断。

	 for (int i = 0; i < 100; i++)

	            {

	                if (bk.CancellationPending) //这里判断一下是否用户要求取消后台进行,并可以尽早退出。

	                {

	                    bk.ReportProgress(i, String.Format("当前值是 {0},操作被用户申请中断", i));

	                    return false;

	                }

	                Thread.Sleep(100);

	                //处理的过程中,通过这个函数,向主线程报告处理进度,最好是折算成百分比,与外边的进度条的最大值必须要对应。这里,我没有折算,而是把界面线程的进度条最大值调整为与这里的总数一致。

	                bk.ReportProgress(i, String.Format(" {0}% ", i));

	            }

通过调用CancelAsync方法可以实现后台线程的终止,不管任何方式的终止都会出发RunWorkerCompleted方法。

最后要说的是progressChanged这个事件,该事件被ReportProgress引发,一般用来做后台线程值变化时响应消息,来处理界面的显示工作

比如:

	    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

	        {

	            this.progressBar1.Value = e.ProgressPercentage;

	            this.label1.Text = e.UserState.ToString();

	            this.label1.Update();

	        }
更详细可以参考http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html