[英]C# Progressbar is not updated accurately in Vista or Windows7
[英]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.