BackgroundWorker组件学习

今天看到别人的博客中提到了BackgroundWorker组件。在现在的系统中有见到过这个组件,由于实际应用的系统中逻辑比较复杂所以也没深入去看。今天凑巧看到了一个关于BackgroundWorker组件的例子,对原代码中存在的问题进行了一下修改。自己也学习了一下。

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;

namespace BackGroundWorkerDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;//报告进度
            backgroundWorker1.WorkerSupportsCancellation = true;//支持取消异步进程
            progressBar1.Maximum = 10000;//进度条的最大值设置要与其真实要显示的值相对应。
            backgroundWorker1.ProgressChanged+=new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
            backgroundWorker1.RunWorkerCompleted+=new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
            backgroundWorker1.DoWork+=new DoWorkEventHandler(backgroundWorker1_DoWork);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
            this.label1.Text = e.UserState.ToString();
            //由于lable的值更新的特别快,此时只是对text属性赋值的话,label也并不能及时ReDraw显示。所以要强制对控件进行刷新
            //可以用label继承的Control的Update方法,也可以用Refresh(),二者均可以强制重绘控件,进行刷新
            this.label1.Update();
            //this.label1.Refresh();
        }
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show(@"运算完成");
        }
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            work(this.backgroundWorker1);
        }
        private bool work(BackgroundWorker bk)
        {
            int tatle = 10000;

            for (int i = 0; i < tatle; i++)
            {
                if (bk.CancellationPending) //这里判断一下是否用户要求取消后台进行,并可以尽早退出。
                {
                    bk.ReportProgress(i, String.Format("当前值是 {0},操作被用户申请中断", i));
                    return false;
                }

                //处理的过程中,通过这个函数,向主线程报告处理进度,最好是折算成百分比,
                //与外边的进度条的最大值必须要对应。这里,我没有折算,而是把界面线程的进度条最大值调整为与这里的总数一致。
                bk.ReportProgress(i, String.Format("当前值是 {0} ", i));
            }
            return true;
        }
    }
}

最后的效果是:

      

 

滚动条的效果还蛮拉风的~

 

posted @ 2013-10-09 22:46  fionhan  阅读(209)  评论(2编辑  收藏  举报