2012-01-06 169 views
2

我寫了使用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%,即使該值已達到最大值。

這是在一種方法中多次使用進度條的獨特之處。

我怎樣才能得到實際的彩條到最後?

(顯然它是一個緩衝的事情嗎?)

+4

其實,海事組織,如果你想準確地更新的進度,你應該在另一個線程與執行你的工作(例如BackgroundWorker),以免妨礙GUI線程。 – Patrick 2012-01-06 16:32:42

+1

無論步長是多少,Vista中的綠色進度條都是動畫並且進展順利。順利進展是這裏的問題,它使可見的欄落後於價值。你通過阻止UI線程使它變得非常糟糕,不允許這種動畫發生。解決方法是*減少價值,酒吧立即趕上。 – 2012-01-06 16:43:39

回答

6

的問題是,您阻止你的UI線程。不要這樣做。在後臺線程中執行所有長時間運行的任務(例如BackgroundWorker),然後編組回UI線程以更新進度條(BackgroundWorker使這非常簡單)......然後一切都會好的。

+0

即使可能更簡單,更糟的解決方案是在*之後使用'DoEvents'(http://msdn.microsoft.com/zh-cn/library/system.windows.forms.application.doevents.aspx)每個*調用到'PerformStep'。 – Patrick 2012-01-06 16:39:32

+1

DoEvents是邪惡的。 – ken2k 2012-01-06 17:00:04

+0

@ ken2k:我知道,這就是爲什麼我寫了「糟糕的解決方案」;-)它仍然有效,雖然 – Patrick 2012-01-06 21:40:11

2

正如Jon所說,在UI線程上工作會干擾IU更新,導致界面無響應。這就是爲什麼你在後臺線程上工作。

對工人的ProgressChanged事件中使用一個BackgroundWorker和更新進度條:

{ 
     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(); 
    } 
+1

感謝你們所有人!偉大的投入,我學會了使用BackgroundWorker!再次,非常感謝! – 2012-01-06 17:20:42