C#:等到进度条完成绘图

时间:2011-08-23 11:40:07

标签: c# progress-bar wait lag

  

可能重复:
  Winforms Progress bar Does Not Update (C#)

第一次在这里向我提问。

我将尝试使用此代码段解释我的问题:

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++)
{
    progressBar1.Value++;
}
MessageBox.Show("Finished");
progressBar1.Value = 0;

此代码的问题在于,当for循环结束时,MessageBox会弹出,当进度条完成绘制时,不是。有没有办法等到进度条完成绘图才能继续?

谢谢你们!

3 个答案:

答案 0 :(得分:3)

您可能需要查看System.Windows.Forms.Application.DoEvents()Reference

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++)
{
    progressBar1.Value++;
    Application.DoEvents();
}
MessageBox.Show("Finished");
progressBar1.Value = 0;

答案 1 :(得分:1)

这里的问题是您正在UI线程上完成所有工作。为了重新绘制UI,通常需要抽取窗口消息。修复此问题的最简单方法是告诉进度条更新。调用Control.Update将强制同步完成任何待处理的绘图。

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++) 
{
     progressBar1.Value++; 
     progressBar1.Update();
} 
MessageBox.Show("Finished"); 
progressBar1.Value = 0; 

可能有效的其他方法是使用后台线程(使用所有额外的Control.Invoke调用来同步回UI线程)。 DoEvents(如前所述)也应该有效 - DoEvents将允许您的窗口再次处理消息,这段时间可能允许您绘制消息。但是,它会抽取消息队列中的所有消息,因此可能会导致不必要的副作用。

答案 2 :(得分:0)

尝试以下代码

progressBar1.Maximum = 50;
for (int i = 0; i < 50; i++)
{
   this.SuspendLayout();
   progressBar1.Value++;
   this.ResumeLayout();
}
MessageBox.Show("Finished");

progressBar1.Value = 0;