BackGroundWorkerControl控件使用实现进度条

BackGroundWorkerControl控件使用实现进度条

代码如下:

  private ManualResetEvent manualReset = new ManualResetEvent(true);

        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
            backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
            backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerChanged);
            backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_Dowork);
            progressBar1.Maximum = 100000;
        }
        //这是后台进程开始工作时,调用工作函数的地方。你可以把现有的处理函数写在这
        private void backgroundWorker1_Dowork(object sender, DoWorkEventArgs e)
        {
            work(backgroundWorker1);
                      
        }
        //这是后台工作完成后的消息处理,可以在这里进行后续的处理工作
        private void backgroundWorker1_RunWorkerChanged(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("处理完成");
        }
        //通过响应消息,来处理界面的显示工作
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
            label2.Text = e.UserState.ToString();
            this.label2.Update();
        }

        private bool work(BackgroundWorker bk)
        {
            int tatle = 100001;
            for(int i = 0; i < tatle; i++)
            {
                if (bk.CancellationPending) //这是是否用户要求取消后台进行,并可以尽早退出
                {
                    bk.ReportProgress(i, string.Format("当前值是{0},操作被用户申请中断", i));
                    return false;
                }
                manualReset.WaitOne();//如果ManualResetEvent的初始化为终止状态(true),那么该方法将一直工作,直到收到Reset信号。然后,直到收到Set信号,就继续工作。
                Thread.Sleep(1);
                bk.ReportProgress(i, string.Format("当前值是{0}", i));
            }
            return true;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if (this.backgroundWorker1.IsBusy)
                return;
            this.backgroundWorker1.RunWorkerAsync();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (button2.Text == "暂停")
            {
                manualReset.Reset();//暂停当前线程的工作,发信号给waitOne方法,阻塞
                button2.Text = "继续";
            }
            else
            {
                manualReset.Set();//继续某个线程的工作
                button2.Text = "暂停";
            }         
           // this.backgroundWorker1.CancelAsync();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            this.Close();
        }

如有不足之处,请进行留言