private void MyBackWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                this.MyBar.Value = e.ProgressPercentage;
                this.labMessage.Text = e.UserState.ToString();
                this.labMessage.Update();
            }
            catch(Exception Ex)
            {
                MessageBox.Show(Ex.Message.ToString());
            }
        }        private void MyBackWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //线程处理完成时
            try
            {
                MessageBox.Show("完成!");
            }
            catch(Exception Ex)
            {
                MessageBox.Show(Ex.Message.ToString());
            }
        }        private void MyBackWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //开始执行后台程序
            try
            {   
                this.work(MyBackWorker,e);
            }
            catch(Exception Ex)
            {
                MessageBox.Show(Ex.Message.ToString());
            }
        }        private void work(BackgroundWorker bk,DoWorkEventArgs e)
        {
            int Nums = 1000000;
            for (int i = 1; i < Nums; i++)
            {
                if (bk.CancellationPending) 
                {
                    bk.ReportProgress(i, String.Format("当前值是 {0},操作被用户申请中断", i));
                    e.Cancel = true;
                    break;
                }
                bk.ReportProgress(i, String.Format("当前值是 {0} ", i));
            }
         }        private void btnStart_Click(object sender, EventArgs e)
        {
            try
            {
                this.MyBackWorker.RunWorkerAsync();
            }
            catch(Exception Ex)
            {
                MessageBox.Show(Ex.Message.ToString());
            }
        }        private void btnStop_Click(object sender, EventArgs e)
        {
            try
            {
                this.MyBackWorker.CancelAsync();
            }
            catch(Exception Ex)
            {
                MessageBox.Show(Ex.Message.ToString());
            }
        }

解决方案 »

  1.   


            private void button2_Click(object sender, EventArgs e)
            {
                BackgroundWorker wb = new BackgroundWorker();
                wb.DoWork += wb_DoWork;
                wb.WorkerReportsProgress = true;
                wb.ProgressChanged += wb_ProgressChanged;
                wb.RunWorkerCompleted += wb_RunWorkerCompleted;
                wb.RunWorkerAsync();
            }        void wb_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                this.button2.Text = "OK";
            }        void wb_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                this.progressBar1.Value = e.ProgressPercentage;
            }        void wb_DoWork(object sender, DoWorkEventArgs e)
            {
                int i = 0;
                while (i < 100)
                {
                    ((BackgroundWorker)sender).ReportProgress(i);
                    i++;
                    Thread.Sleep(300);
                }
            }给个简单例子给你看。
      

  2.   

    问题在于循环体执行太快了,ReportProgress后,界面来不及处理,看起来是假死。定义一个全局变量,tempTime = DateTime.Now;
    然后把下面的代码加到For体的最上面,你就能看到效果。
    if (DateTime.Now.Subtract(tempTime).Ticks == 0)
        continue;
    else
        tempTime = DateTime.Now;
      

  3.   

    循环太快了,可以没循环500次 执行一次 MyBackWorker_ProgressChanged