若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。
这里使用《C#高级编程》里面的一个例子说明这个类的使用:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace EventAsync
{
public partial class frmBackgroundWorker : Form
{
public frmBackgroundWorker()
{
InitializeComponent();
}
private void btnCal_Click(object sender, EventArgs e)
{
this.btnCal.Enabled = false;
this.txtResult.Text = String.Empty;
this.btnCancel.Enabled = true;
this.prosbarCal.Value = 0;
bgworkerCal.RunWorkerAsync(new CalcInput(int.Parse(this.txtX.Text), int.Parse(this.txtY.Text)));
}
private void OnDoWork(object sender, DoWorkEventArgs e)
{
CalcInput input = (CalcInput)e.Argument;
for (int i = 0; i < 10; i++)
{
Thread.Sleep(5000);
bgworkerCal.ReportProgress(i * 10);
if (bgworkerCal.CancellationPending)
{
e.Cancel = true;
return;
}
}
e.Result = input.x + input.y;
}
private void OnWorkCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
this.txtResult.Text = "Cancelled";
}
else
{
this.txtResult.Text = e.Result.ToString();
}
this.btnCal.Enabled = true;
this.btnCancel.Enabled = false;
this.prosbarCal.Value = 100;
}
private void frmBackgroundWorker_Load(object sender, EventArgs e)
{
}
private void btnCancel_Click(object sender, EventArgs e)
{
bgworkerCal.CancelAsync();
}
private void OnProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.prosbarCal.Value = e.ProgressPercentage;
}
}
}
在这里例子里:
加入一个backgroundworker类到windows form程序中
BackgroundWorker类有以下属性和方法
属性:
Name
GenerateMember: True 这个属性不常用
Modifiers Private 基本不用改
WorkerReportsProgress: 默认的是false,如果你在程序中要求backgroundworker类report progress进度,就需要把它设置为true. 在这个程序里,我们需要利用backgroundworker类向进度条回报进度,所以设置为true
WorkerSupportsCancellation: 默认是false 在这个程序里,我们需要启用取消功能,所以把它设置为true.
方法:
DoWork
ProgressChanged
RunWorkerCompleted
这三个方法结合示例说明。
在这里我们给backgroundworker类的三个方法分别指定
DoWork: OnDoWork
private void OnDoWork(object sender, DoWorkEventArgs e)
{
CalcInput input = (CalcInput)e.Argument;
for (int i = 0; i < 10; i++)
{
Thread.Sleep(5000);
bgworkerCal.ReportProgress(i * 10);
if (bgworkerCal.CancellationPending)
{
e.Cancel = true;
return;
}
}
e.Result = input.x + input.y;
}
看这段代码就知道了
DoWork 方法指的是backgroundworker类在运行过程中需要做的事情。对应的入口应该是
bgworkerCal.RunWorkerAsync(new CalcInput(int.Parse(this.txtX.Text), int.Parse(this.txtY.Text)));
也就是这样的顺序:
BackgroundWorker调用RunWorkerAsync方法------> 执行backgroundworker类的DoWork方法---------->进度更新的时候执行ProgressChanged方法----------------->进度完成或者取消时执行RunWorkerCompleted方法
在OnWork对应的事件OnDoWork里面, backgroundworker做以下工作:
a. 主要程序,比如读取数据什么的
b. 反馈进度 bgworkerCal.ReportProgress(i * 10);
c. 处理cancel. 如果在DoWork过程中,用户触发了bgworkerCal.CancelAsync()事件,做相应的处理
if (bgworkerCal.CancellationPending)
{
e.Cancel = true;
return;
}
CancellationPending属性指示是否backgroundworker类接收到了CancelAsync事件。
在ProgressChanged对应的事件OnProgressChanged里面,backgroundworker做以下工作:
a. 把进度反映到进度条上
在RunWorkerCompleted对应的OnWorkCompleted事件里,backgroundworker做以下工作:
a. 如果用户cancel了,显示相应结果
b. 如果用户没有cancel,显示成功运行结果
c. 进度设置为完成标志
其他的例子再慢慢分析了。