本文简单介绍下BackgroundWorker及使用方法举例。
1.介绍
BackGroundWorker是微软提供的封装好了的,常用于在后台开启一个线程执行耗时操作,避免UI线程不响应。
BackgroundWorker使用起来很方便,直接从工具箱中拖拽一个控件到Winfrom窗体即可。控件拖到窗体上后,点击该控件,打开属性窗口的事件,可以看到该控件只有三个事件方法。
BackgroundWorker的三个事件方法:
1、DoWork:线程执行的动作,一般用于执行耗时操作,如耗时查询,耗时计算等。
2、ProgressChanged:ReportProgress 引发 ProgressChanged 事件。调用ReportProgress方法前需要预先设置BackgroundWorker的属性WorkerReportProgress=true。这之后,线程进度变化,或者进度条变化时 ,就会调用ProgressChanged方法,修改进度条值。
//DoWork方法里可以调用ReportProgress报告进度this.backgroundProjectIssues.ReportProgress(0, message);
3、RunWorkerCompleted:线程完成时调用的方法。此时,又回到主线程执行了,可以访问主线程中的UI,操作主线程的UI
BackgroundWorker 的各属性、方法、事件的调用机制和顺序:
该图来自于:C# BackgroundWorker详解,图例,原理分析
2.使用举例:后台耗时操作 2.使用举例:后台耗时操作
[C] 纯文本查看 复制代码 ///
/// 执行耗时操作
///
///
///
private void backgroundProjectIssues_DoWork(object sender, DoWorkEventArgs e)
{
try
{
e.Result = false;
//repositoryItemProgressBar2 进度条
this.repositoryItemProgressBar2.ShowTitle = true;
//this.repositoryItemProgressBar2.Step = 1;
this.repositoryItemProgressBar2.LookAndFeel.SkinMaskColor = Color.LawnGreen;
this.repositoryItemProgressBar2.Maximum = 100000;
this.repositoryItemProgressBar2.Minimum = 0;
this.barEditItem_status.EditValue = 0;
int sum=0;
for(int i=0;i<100000;i++){
//计算
sum+=i;
#region 报告进度
// this.barEditItem_status.EditValue = i;
message = "进度条显示信息" + i;
//ReportProgress 方法把信息传递给 ProcessChanged 事件处理函数。
//第一个参数类型为 int,表示执行进度。
//如果有更多的信息需要传递,可以使用 ReportProgress 的第二个参数。
//这里我们给第二个参数传进去一条消息。
this.backgroundProjectIssues.ReportProgress(i, message);
#endregion
}
}catch (System.Exception ex)
{
//捕获异常
}
}
///
/// 报告进度
///
///
///
private void backgroundProjectIssues_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//修改进度条的显示。 //barEditItem是DEvExprress的一个进度条控件
this.barEditItem_status.EditValue = e.ProgressPercentage;
//如果有更多的信息需要传递,可以使用 e.UserState 传递一个自定义的类型。
//这是一个 object 类型的对象,您可以通过它传递任何类型。
string message = e.UserState.ToString();
this.barEditItem_status.Caption = message;
}
///
///
///
///
///
private void backgroundProjectIssues_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
try
{
if ((bool)e.Result)
{
MessageBox.Show("耗时操作完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (System.Exception ex)
{
}
}
通过RunWorkerAsync()方法程序开始执行异步耗时操作,该调用语句可以放在窗体构造函数中,或者开始执行耗时操作的按钮中,都可以。
[C] 纯文本查看 复制代码 // 开始执行后台操作(检测更新耗时操作)
this.backgroundUpdate.RunWorkerAsync();
以下是我项目中实现的效果:
|