簡體   English   中英

如何准確刷新ProgressBar

[英]How to refresh ProgressBar accurately

我寫了一個使用 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並更新工作者的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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM