关于BackgroundWorker的使用

根据上一篇 关于线程的学习与总结 ,我们接触了BackgroundWorker 类,也认识到了它的强大,现将它进一步研究,扩展思维。

 

命名空间:System.ComponentModel

程序集: System(在system.dll中)

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

 

1.主要事件

DoWork: 为该事件添加一个事件处理程序,在此事件处理程序中调用耗时的操作。当执行

              RunWorkerAsync 方法时会触发该事件,并且传递DoWorkEventArgs参数; 

 

 不传参数方式:

BackgroundWorker myDataWorker = new BackgroundWorker();
myDataWorker.DoWork 
+= new DoWorkEventHandler(delegate(object o, DoWorkEventArgs workerEventArgs)
{
     workerEventArgs.Result 
= GetData();//加载数据
}
);

 

传参数方式: 

BackgroundWorker myDataWorker = new BackgroundWorker();
myDataWorker.DoWork 
+= new DoWorkEventHandler(delegate(object o, DoWorkEventArgs e)
{
    BackgroundWorker worker 
= o as BackgroundWorker;

    e.Result 
= DoMethod((int)e.Argument,worker,e);  //返回结果
}
); 
                  
int param = "100";//传入参数

myDataWorker.RunWorkerAsync(param);

 

ProgressChanged: 在调用 ReportProgress 方法时,触发ProgressChanged事件.而且允许ReportProgress 传递参数给ProgressChanged事件,第一个参数提供一个0-100之间的整数,第二个参数可以提供任何一个对象,它们分别被命名为ProgressPercentage 和 UserState.。(注意:只有在WorkerReportsProgress属性被设置为true该方法才可用)。

 

BackgroundWorker myDataWorker = new BackgroundWorker();
myDataWorker.WorkerReportsProgress 
= true;
myDataWorker.DoWork 
+= new DoWorkEventHandler(delegate(object o, DoWorkEventArgs e)
{
    BackgroundWorker worker 
= o as BackgroundWorker;
    
int Count = (int)e.Argument;
    
for (int i = 0; i < Count; i++)
    
{
        
if (worker.CancellationPending)
        
{   
            e.Cancel 
= true;
        }

        
else
        
{   
            worker.ReportProgress((i 
+ 1* (100 / Count), (object)i);
        }

    }

}
); 

myDataWorker.ProgressChanged 
+= new ProgressChangedEventHandler(delegate(object o, ProgressChangedEventArgs e)
{
    
this.progressBar1.Value = e.ProgressPercentage;
}
); 
                  
int param = "100";//传入参数

myDataWorker.RunWorkerAsync(param);

 

RunWorkerCompleted: 异步操作完成后会触发该事件,当然如果需要在操作过程中结束可以执行CancelAsync方法要求异步调用中止,并且在异步委托操作中检测CancellationPending属性如果为true的话,跳出异步调用,同时将DoWorkEventArgs.Cancel属性设为true,这样当退出异步调用的时候,可以让处理RunWorkerCompleted事件的函数知道是正常退出还是中途退出。

 

BackgroundWorker myDataWorker = new BackgroundWorker();
myDataWorker.WorkerSupportsCancellation 
= true;
//
//
//
myDataWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(delegate(object o,RunWorkerCompletedEventArgs e)
{
Console.Out.WriteLine(
"异步调用结束!");
}
);

  


private void cancelButton_Click(System.Object sender, 
    System.EventArgs e)
{       
    
this.myDataWorker.CancelAsync();
    
    cancelButton.Enabled 
= false;
}

 

posted @ 2008-08-19 12:01  WaveQian  阅读(2419)  评论(0编辑  收藏  举报