.NET 2.0 组件 BackgroundWorker 详解及示例

.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
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值