此方法可以实现后台程序调用、创建线程、遮屏的效果。
BackgroundWorker主要有三个事件:RunWorkerCompleted,ProgressChanged,DoWork
[csharp] 
      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对象,
[csharp] 
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
 
        { 
 
            BackgroundWorker worker = (BackgroundWorker)sender; 
 
lt; 
        }
或者 直接可以获得类中的BackgroundWorker,在DoWork方法中主要是读条处理的细节方面,通过BackgroundWorker 对象的ReportProgress把百分数传出,
for循环中最大值是100可以表示为百分数的分母,与progressBar的Maximum的属性保持一致。此处还要注意的是,要加上 Thread.Sleep(100),否则线程一直执行,主面板其他控件则无法使用, 也就无法取消当前线程。在每次循环中,一定要校验下CancellationPending是否为真,表示当前线程是否被用户中断。
[csharp] 
 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引发,一般用来做后台线程值变化时响应消息,来处理界面的显示工作
比如:
[csharp] 
    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
 
        { 
 
            this.progressBar1.Value = e.ProgressPercentage; 
 
            this.label1.Text = e.UserState.ToString(); 
 
            this.label1.Update(); 
 
        }

posted on 2014-04-01 13:49  清风暮雨  阅读(3176)  评论(0编辑  收藏  举报