.NET 2.0 组件 BackgroundWorker 讲解 from:Kimi
.NET 2.0 组件 BackgroundWorker 讲解 from:Kimi
(Visual Studio.NET开发环境 C#语言)
BackgroundWorker组件可以在不同于应用程序的主用户界面线程的另一线程上异步(“在后台”)执行耗时的操作,相对直接使用Thread,它的更为简单且直接在UI上实现,主要应用在:图像下载;Web 服务调用;文件下载和上载(包括点对点应用程序);复杂的本地计算;数据库事务;本地磁盘访问(相对于内存访问来说其速度很慢)……
接下来,我以一个实际应用的例子来讲解如何使用BackgroundWorker组件:
应用概述->在Form里对DataGridView中大量的数据进行复杂的处理,并且逐一检查数据库(Oracle)中的数据,进行大量的查询工作,这将耗用大量的时间,因此还需要在UI中显示进度给用户。
1:向窗体中添加“组件”选项卡的“工具箱”中BackgroundWorker组件
2:BackgroundWorker属性设置:
WorkerReportsProgress = true; //组件线程是否报告进度
WorkerSupportsCancellation = true; //组件线程是否支持取消
3:在InitializeComponent()中声明事件:
DoWork 事件启动需要执行的异步后台方法
RunWorkerCompleted 事件由DoWork处理完成返回时将引发
ProgressChanged 事件用来报告异步后台执行的进度
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted); this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);
4:主要代码:
//定义进程完成计数
private int numberToCompute = 0;
//DataGridView数据从Oracle数据库获取
//这里不做详解
//Oracle数据需要添加引用using System.Data.OracleClient;
………………
{
string ConnectionString = "Data Source=test;user=test;password=test;"; //写连接串
OracleConnection conn = new OracleConnection(ConnectionString); //创建一个新连接
try
{
string sqlstring = "select ××××××";
OracleDataAdapter adapter = new OracleDataAdapter(sqlstring, conn);
DataSet ds = new DataSet();
adapter.Fill(ds, "MYTABLE");
this.dataGrid1.DataSource = ds.Tables["MYTABLE"];
conn.Close();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message); //如果有错误,输出错误信息}
}
finally
{
conn.Close(); //关闭连接}
}
}
//需要异步运行在后台的方法,需要定义3个参数
void backMethod(int n, BackgroundWorker BW, DoWorkEventArgs e)
{
//以循环访问为例
//Counter可以从DataGridView的Rows.Count获取
//也可以根据需要报告进度的内容设置循环
int i;
for (i = 0; i < Counter; i++)
{
//由BackgroundWorker.ReportProgress(Int32)方法引发ProgressChanged事件
//假设进度条为(0~100)%
//计算ReportProgress进度参数
int BWrp=( i + 1 ) * 100 / Counter;
//执行进度更新
BW.ReportProgress( BWrp );
//添加逐行处理DataGirdView内容和数据库查询的方法代码
…………
//可以使用OracleCommand类及CreateCommand()和ExecuteReakder();
//OracleDataReader类及HasRows属性等方法查询操作
}
}
//异步后台方法运行事件
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//执行需要异步运行在后台的方法
backMethod((int)e.Argument, backgroundWorker1, e);
}
//异步后台运行事件进度
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//对进度条赋值
this.progressBar1.Value = e.ProgressPercentage;
//添加需要向Form主线程报告进度的其它代码…………
}
//返回后完成事件
private void backgroundWorker1_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{
//……
}
5:在需要执行异步后台的事件中调用
BackgroundWorker.RunWorkerAsync(Object) 方法执行后台操作
//RunWorkerAsync方法提交一个启动以异步方式运行的操作的请求。
//发出该请求后,将引发
DoWork 事件,该事件随后开始执行后台操作。
//如果操作需要参数,可以将其作为
argument 参数提供给
RunWorkerAsync。
//如果后台操作已在运行,则再次调用
RunWorkerAsync 将引发
InvalidOperationException。
//开始执行
this.backgroundWorker1.RunWorkerAsync(numberToCompute);
OK,讲述了BackgroundWorker组件的主要内容,希望在不同应用中给大家一些启发。
Kimi
20080710