为什么backgroundworker和progressBar不能正常工作?

时间:2014-04-02 12:51:33

标签: c# winforms

我所看到的是progressBar每次从开始向右移动一点然后重新开始不间断。

我想要做的是每次我的程序在这种情况下等待下一次更新10秒后,progressBar会在它到达最后时向右移动10步(秒)进行新的更新。

这就是我现在所做的:

在我改变的构造函数中,只启动后台工作。的RunWorkerAsync() 然后在底部我使用backgroundworker的3个事件:

private void bgwPrim_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 1; i <= 10; i++)
            {
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {

                    System.Threading.Thread.Sleep(500);
                    worker.ReportProgress(i * 10);

                    client.Encoding = System.Text.Encoding.GetEncoding(1255);
                    page = client.DownloadString("http://rotter.net/scoopscache.html");
                    TextExtractor.ExtractDateTime(page, newText, dateTime);
                    StreamWriter w = new StreamWriter(@"d:\rotterhtml\rotterscoops.html");
                    w.Write(page);
                    w.Close();
                    TextExtractor.ExtractText(@"d:\rotterhtml\rotterscoops.html", newText, dateTime);
                }
            }
        }

        private void bgwPrim_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            label9.Text = e.ProgressPercentage.ToString();
            label9.Visible = true;
            scrollLabel1.Reset();
            scrollLabel1.Text = " ";
            scrollLabel1.Invalidate();
            combindedString = string.Join(Environment.NewLine, newText);
            this.scrollLabel1.Text = combindedString;
            scrollLabel1.Invalidate();


        }

        private void bgwPrim_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                label10.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                label10.Text = "Error: " + e.Error.Message;
            }
            else
            {
                label10.Text = "Done!";
            }
        }

我将更新方法在DoWork事件中切换为两个,在progressChanged事件中切换一些。 问题现在是:

我如何在10秒后完成背景工作,或者当它达到100%重置所有并重新开始不间断时?

第二,当我现在正在运行程序时,整个文本和progressBar就像停止/卡住第二次或更少每次10%的进度然后继续直到100%它的剂量移动顺利。

1 个答案:

答案 0 :(得分:1)

您使用BackgroundWorker的方式有一些问题。

  • 您正在将temp传递给DoWork事件,但之后却没有使用它。 (它在e.Argument内,位于DoWork事件内。)
  • 你的DoWork事件是一个无限循环,没有希望结束。您的工作人员支持取消,但您从未检查过。
  • 您的ProgressChanged事件被快速调用 - 每秒多次 - 太快,您无法在UI中看到任何更改,因为它甚至没有时间刷新。

由于您BackgroundWorker中的所有工作都在UI线程上运行,因此可能有更好的方法来实现您想要实现的目标。

尝试将System.Windows.Forms.Timer控件放到表单上,将间隔设置为10秒,然后从那里调用Update()

  • 您可以保留progressBar1并更新其值。
  • Timer.Tick事件中的所有内容都已在UI线程上运行。
  • 一直运行直到你告诉它停止,这就是你在while(true)中使用DoWork循环所做的事情。