2012-01-06 167 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