如何准确刷新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%的范围,即使该值已达到最大值。

这是在一个方法中多次使用进度条所独有的。

我如何才能得到真正的彩色条到最后?

(显然是缓冲作用?)

如何准确刷新ProgressBar

问题是您阻塞了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();