我写了一个使用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%跨越,即使该值已达到最大值。
这在一种方法中多次使用进度条是唯一的。
如何让实际的彩色条到达最后?
(显然它是缓冲的东西?)
答案 0 :(得分:6)
问题是你正在阻止你的UI线程。不要那样做。在后台线程中执行所有长时间运行的任务(例如BackgroundWorker
)并编组回UI线程以更新进度条(BackgroundWorker
使这非常简单)...然后所有应该是好。
答案 1 :(得分:2)
正如Jon所说,在你的UI线程上工作会干扰IU更新,使界面无响应。这就是你在后台线程上工作的原因。
使用BackgroundWorker并更新工作人员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();
}