.Net 封装好的多线程--BackgroundWorker

        最近做了一个“窗体加载中,请稍后”外加一个滚动条的winForm的窗体,感觉挺实用的,在这里给大家说一下。

        因为做项目的时候,我做的是一个显示统计图的一个功能,但是这个数据量有点大,统计出来以后比较慢,需要两三秒的卡顿,也就是假死状态,所以做了一个窗体加载中,请稍后的窗体,外加一个滚动条。

       开始知道这是需要多线程来处理的,一上来我先显示“窗体加载中”的窗体,让另一个线程去加载数据,于是查了很多的多线程的资料,后来才发现一个简简单单的控件就可以搞定,那就是Backgroundworker控件。

他的用法很简单,就是在开始的时候,讲我们要加载数据的方法写到他的DOWork方法里边,然后运行这个控件RunWorkerCompleted这个方法,他就会自动的开启一个线程,去加载里边的数据,然后加载完毕以后关闭就可以。            用法如下。

       用于加载数据的窗体

       首先我们把我们要加载的数据放到DOWork中,但是有一点要记住,在dowork中,不能涉及到控件,这样回报错。

/// <summary> 
        /// 异步 开始事件 
        /// </summary> 
        /// <param name="sender"></param> 
        /// <param name="e"></param> 
        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            //需要执行的代码 
            dt_CarsRepair = bll.GetRepairCount();
            dt_Train = bll.GetTrainsCount();
            dt_CarsDept = bll.GetSignCount();
        } 
        然后是执行完成后

    #region 异步执行完成后
        /// <summary> 
        /// 事件: 异步执行完成后  
        /// </summary> 
        /// <param name="sender"></param> 
        /// <param name="e"></param> 
        private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            处理数据
            MessageBox.Show("数据加载完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
       

        } 
        然后把这两个方法在窗体加载的时候添加到backgroundwork的控件中,代码如下

            worker = new BackgroundWorker();
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        最后from_load()中添加显示“窗体加载中”这个窗体,那么我们的主窗体的代码就完毕了。

     
            //异步执行开始 
            worker.RunWorkerAsync();

            //显示进度窗体 
            frmWaitting frm = new frmWaitting(this.worker);
            frm.StartPosition = FormStartPosition.CenterScreen;
            frm.ShowDialog(this);

        用户显示“窗体加载中,请稍后。。。”的窗体

         这个窗体需要添加一个backgroundwork控件,然后添加事件

 

       void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.Close();
            
        }

        void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            lblStatus.Text = "数据加载中..."; 
        }
        窗体启动中,同样记载这两个方法。

        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
       这样我们的窗体加载中,就可以实现了,如果你还想加一个滚动条的话,只需要加一个 progressBar的控件,把style设置成Marquee就可以了,是不是简单。

       

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值