【问题标题】:C#: Wait until progressbar finished drawing [duplicate]C#:等到进度条完成绘制[重复]
【发布时间】:2011-08-23 11:40:07
【问题描述】:

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

第一次在这里问我问题。

我将尝试使用此代码 sn-p 来解释我的问题:

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

这段代码的问题是MessageBox在for循环完成时弹出,不是在进度条完成绘制时弹出。有什么办法可以等到进度条画完再继续?

谢谢大家!

【问题讨论】:

  • @janw 将我的代码添加到我的答案中

标签: c# progress-bar wait lag


【解决方案1】:

您可能想看看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;

【讨论】:

  • 这似乎是最好的方法,但我无法让它工作。似乎没有一点帮助,酒吧仍然滞后。不过,我只是复制并粘贴了代码。所以也许我不太明白这个^^。阅读System.Windows.Forms.Application.DoEvents() 对我也没有帮助:D
  • 滞后?或者你看不到它的进展?最大值为50,在我的机器上需要8ms,所以绝对不是可以滞后的进度。
  • 嗯,MessageBox 在进度条开始绘制之前就打开了(我知道它没有,但它看起来就是这样)。
  • 请增加最大值以供参考并再次检查。这对我来说没有意义。
  • progressBar1.Maximum 和 for 循环都增加到 100000。现在我可以看到改进了。 MessageBox 现在出现在大约。进度条完成 60%。
【解决方案2】:

这里的问题是您在 UI 线程上完成所有工作。为了重新绘制 UI,您通常需要泵送 Windows 消息。解决此问题的最简单方法是告诉进度条进行更新。调用Control.Update 将强制同步完成任何挂起的绘图。

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

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

【讨论】:

    【解决方案3】:

    试试下面的代码

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

    【讨论】:

    • 嗯。似乎不起作用...仍然是同样的问题。
    • 这样你就不会看到进度逐渐更新了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2011-09-23
    • 2018-07-21
    • 2013-02-13
    • 2019-09-14
    相关资源
    最近更新 更多