关于BackgroundWorker的使用
根据上一篇 关于线程的学习与总结 ,我们接触了BackgroundWorker 类,也认识到了它的强大,现将它进一步研究,扩展思维。
命名空间:System.ComponentModel
程序集: System(在system.dll中)
作用: BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。
1.主要事件
DoWork: 为该事件添加一个事件处理程序,在此事件处理程序中调用耗时的操作。当执行
RunWorkerAsync 方法时会触发该事件,并且传递DoWorkEventArgs参数;
不传参数方式:
myDataWorker.DoWork += new DoWorkEventHandler(delegate(object o, DoWorkEventArgs workerEventArgs)
{
workerEventArgs.Result = GetData();//加载数据
});
传参数方式:
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该方法才可用)。
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事件的函数知道是正常退出还是中途退出。
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;
}