none
backgroundworker与progressbar 使用的问题,,谢谢回答 RRS feed

  • 问题

  • backgroundworker与progressbar  使用的问题,,谢谢回答

    backgroudworker + progressbar 实现线程

    功能实现了,其中有一段DoWorker事件代码是这样写的  如下:

    我这个是实现邮件发送时显示的 滚动条,可是有的时候 for 里的  i 到100了,邮件没有发送完,它也会提示发送功能,这个问题怎么解决?

    我的意思是想知道  用什么办法来实现 for(int i = 0 i <(这里应该得到邮件具体用时的时间) ;i++)怎么得到?

    private void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                e.Result = WorkTimer(worker, e);
            }
            private int WorkTimer(object sender, DoWorkEventArgs e)
            {
                for (int i = 0; i < 100; i++)
                {
                    if (worker.CancellationPending)
                    {
                        e.Cancel = true;
                        return -1;
                    }
                    else
                    {
                        worker.ReportProgress(i);
                    }
                    ///   将当前线程挂起指定的时间
                    System.Threading.Thread.Sleep(100);
                }
                return -1;
            }
    2010年4月6日 6:26

答案

全部回复

  • 你好!

    全部发送完成的提示,应该写到 RunWorkerCompleted 事件中去。DoWork 事件执行完后或异常后都会调用 RunWorkerCompleted 事件。


    知识改变命运,奋斗成就人生!
    2010年4月6日 6:40
    版主
  • 我明白您的意思,可是我想要实现的 progressbar进度为100%时就完成,这个要怎么测试?(不知道我说明白了吗)

     

    // Send Email
            private void ButSend_Click(object sender, EventArgs e)
            {
                Progressbar f2 = new Progressbar();
                f2.Show();
                worker.WorkerReportsProgress = true;
                worker.WorkerSupportsCancellation = true;
                worker.DoWork +=new DoWorkEventHandler(worker_DoWork);
                worker.DoWork +=new DoWorkEventHandler(SendDoWork);
                worker.ProgressChanged += new ProgressChangedEventHandler(f2.ProgressChanged);
                worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(f2.CloseForm);
                worker.RunWorkerAsync();
            }
    
           private void worker_DoWork(object sender, DoWorkEventArgs e)
            {
                e.Result = WorkTimer(worker, e);
            }
            private int WorkTimer(object sender, DoWorkEventArgs e)
            {
                for (int i = 0; i < 100; i++)
                {
                    if (worker.CancellationPending)
                    {
                        e.Cancel = true;
                        return -1;
                    }
                    else
                    {
                        worker.ReportProgress(i);
                    }
                    ///   将当前线程挂起指定的时间
                    System.Threading.Thread.Sleep(100);
                }
                return -1;
            }
            private void SendDoWork(object sender, DoWorkEventArgs e)
            {
                try
                {
                    emailinfo.To = this.txtTo.Text.Trim().ToString();
                    emailinfo.Subject = this.txtSubject.Text.Trim().ToString();
                    emailinfo.Content = this.txtBody.Text;
                    emailinfo.Attachment = "";
                    SendEamil.SendEmail(emailinfo);
                    MessageShow.Information("邮件发送成功", "邮件信息");
                }
                catch (Exception ex)
                {
                    MessageShow.None(ex.Message, null);
                }
            }
    
    
    另一个 窗体类
    public void CloseForm(object sender, RunWorkerCompletedEventArgs e)
            {
                this.Close();
            }
            /// <summary>
            /// Show progressbar
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            public void ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                this.progressBar1.Style = ProgressBarStyle.Continuous;
                this.progressBar1.Value = e.ProgressPercentage;
            }
    2010年4月6日 6:44
  • 你是不是滚动条每次递增量没有算对。

    比如:我要发 10 封邮件。那么我每发一封滚动条应该递增 10%


    知识改变命运,奋斗成就人生!
    • 已标记为答案 server126 2010年4月6日 7:17
    2010年4月6日 6:48
    版主
  • 你不可能得到邮件具体用时的时间,只能做个假的

     


    http://feiyun0112.cnblogs.com/
    • 已标记为答案 server126 2010年4月6日 7:17
    2010年4月6日 7:06
    版主