如何准确刷新ProgressBar
本文关键字:ProgressBar 刷新 何准确 | 更新日期: 2023-09-27 18:19:34
我写了一个简短的方法,使用for循环2次:
progressBar1.Minimum = 1;
progressBar1.Maximum = 1000000;
progressBar1.Step = 1;
for (int idx = 1; idx < 1000000; idx++)
{
progressBar1.PerformStep();
}
Thread.Sleep(2000);
progressBar1.Invalidate();
this.Update();
progressBar1.Value = 1;
for (int idx = 1; idx < 1000000; idx++)
{
progressBar1.PerformStep();
}
我的问题是:在第一次传递时,当值达到1000000时,只有实际的彩色条显示大约50-75%的范围,但从不显示100%的范围,即使该值已达到最大值。
这是在一个方法中多次使用进度条所独有的。
我如何才能得到真正的彩色条到最后?
(显然是缓冲作用?)
问题是您阻塞了UI线程。不要那样做。在后台线程(例如BackgroundWorker
)中执行所有长时间运行的任务,并封送回UI线程以更新进度条(BackgroundWorker
使这变得非常琐碎)。。。那么一切都会好起来的。
正如Jon所说,在UI线程上执行操作会干扰IU更新,从而使界面无响应。这就是你在后台线程上工作的原因。
使用BackgroundWorker并在worker的ProgressChanged事件上更新进度条:
{
progressBar1.Value = 1;
progressBar1.Minimum = 1;
progressBar1.Maximum = 100;
progressBar1.Step = 1;
var bgw = new BackgroundWorker();
bgw.ProgressChanged += bgw_ProgressChanged;
bgw.DoWork += bgw_DoWork;
bgw.WorkerReportsProgress = true;
bgw.RunWorkerAsync();
}
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
// do your long running operation here
for (int idx = 1; idx <= 100; idx++)
// when using PerformStep() the percentProgress arg is redundant
((BackgroundWorker)sender).ReportProgress(0);
}
void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.PerformStep();
}
progressBar.Invoke((MethodInvoker)delegate ()
{
this.progressBar.Value = (int)((100 * indexOFfreq) / countFReq);
PB_persent.Text = progressBar.Value.ToString() + "%";
});
Application.DoEvents();