BackgroundWorker做了个进度条,可以成功执行到最后,如果在执行过程中点取消进程后,再点击执行,发现会重复执行两次,如果再点取消,就会执行3次不知道什么原因,高手帮看看
 public partial class Form1 : Form
    {
        private BackgroundWorker bw = new BackgroundWorker();       // string str1到  str9定义不贴了              
IList<Model.sendMes> messList = new SQLServerDAL.sendMes().GetAllList("top 10 *", null, "id asc");// id desc        FULLTUNNELCONTROLLib.FullTunnelServiceControlClass my = new FULLTUNNELCONTROLLib.FullTunnelServiceControlClass();        int successNum = 0;  
        public Form1()
        {
            InitializeComponent();
        }        private void btnSendAll_Click(object sender, EventArgs e)
        {
            ProgressForm progressForm = new ProgressForm();
            progressForm.Show();            bw.WorkerReportsProgress = true;
            bw.WorkerSupportsCancellation = true;
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            bw.ProgressChanged += new ProgressChangedEventHandler(progressForm.OnProgressChanged);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(progressForm.OnProcessCompleted);            if (bw.IsBusy != true)
            {
                bw.RunWorkerAsync();
                           }
        }
        //取消
        private void btnCancel_Click(object sender, EventArgs e)
        {
            if (bw.IsBusy)
            {
                this.lbProgress.Text = "Cancelling...";
                bw.CancelAsync();
                
            }
                   }        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            sendMes((BackgroundWorker)sender, e);
        }        private void sendMes(BackgroundWorker worker, DoWorkEventArgs e)
        {            for (int i = 0; i < messList.Count; i++)
            {
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
               
                }
                else
                {    worker.ReportProgress((i + 1) * (100 / messList.Count));                    Thread.Sleep(500);
                }
            }
        }        private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            //群发 ----耗时的方法           
             try
            {
                for (int i = 0; i < messList.Count; i++)
                {
                    str5 = messList[i].mobilephone.ToString();                    
 int ErrorMessage = Convert.ToInt32(my.FullTunnelServiceControl(ref str1, ref str2, ref str3, ref str4, ref str5, ref str6, ref str7, ref str8, ref str9));                    if (ErrorMessage.ToString() == "1")
                    {
                       successNum = successNum + 1;
                    }                }
              this.lbProgress.Text = ("已发送" + e.ProgressPercentage.ToString() + "%");            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                throw;
            }        }        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                this.lbProgress.Text = "Cancelled";
               
            }
            else if (e.Error != null)
            {
                this.lbProgress.Text = "Error";
            }
            else
            {
                this.lbProgress.Text = "Success!";
                MessageBox.Show("发送完毕");
            }                 }    }

解决方案 »

  1.   


    bw.WorkerReportsProgress = true;
                bw.WorkerSupportsCancellation = true;
                bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
                bw.ProgressChanged += new ProgressChangedEventHandler(progressForm.OnProgressChanged);
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
                bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(progressForm.OnProcessCompleted);这部分放在form_load事件中就好了,事件只需要在最开始绑定一次就可以了.你每次点击btnSendAll按钮,事件就多绑定一次,当然就会多执行一次啊.这跟你中途是否取消没有关系.    因为委托是支持多路广播的.
      

  2.   

    我的自定义很耗时的方法放在  ProgressChanged()里面有什么问题没
      

  3.   


     private void sendMes(BackgroundWorker worker, DoWorkEventArgs e)
            {            for (int i = 0; i < messList.Count; i++)
                {
                    //群发 ----耗时的方法     
                    str5 = messList[i].mobilephone.ToString();
                    int ErrorMessage = Convert.ToInt32(my.FullTunnelServiceControl(ref str1, ref str2, ref str3, ref str4, ref str5, ref str6, ref str7, ref str8, ref str9));                if (ErrorMessage.ToString() == "1")
                    {
                        successNum = successNum + 1;
                    }                 worker.ReportProgress((i + 1) * (100 / messList.Count));                if (worker.CancellationPending == true)
                    {
                        e.Cancel = true;
                        break;                }
                    else
                    {
                        Thread.Sleep(500);
                    }
                }
            }        private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                try
                {
                    this.lbProgress.Text = ("已发送" + e.ProgressPercentage.ToString() + "%");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    throw;
                }        }
    耗时工作在sendMes中完成,也就是在bw_DoWork中完成,bw_ProgressChanged中只需要report Progress,做一件事就可以了。你那要多做了个循环,没必要