我所看到的是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%它的剂量移动顺利。
答案 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
循环所做的事情。