如何准确刷新ProgressBar

时间:2012-01-06 16:29:26

标签: c#

我写了一个使用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%跨越,即使该值已达到最大值。

这在一种方法中多次使用进度条是唯一的。

如何让实际的彩色条到达最后?

(显然它是缓冲的东西?)

2 个答案:

答案 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();
    }