【问题标题】:Progress Bar (marquee) disappears while code is running代码运行时进度条(选取框)消失
【发布时间】:2013-12-24 08:26:51
【问题描述】:

我有一个带有按钮和进度条的简单表单。用户单击按钮开始处理,并且在代码运行时进度条动画。在这种情况下,它只是一个 for 循环。但问题是进度条只出现了几分之一秒然后就消失了。

private void button1_Click(object sender, EventArgs e)
{
    progressBar1.Style = ProgressBarStyle.Marquee;
    progressBar1.MarqueeAnimationSpeed = 100;

    for (int i = 0; i < 3; i++) { Thread.Sleep(1000); } // sleep 3 times for 1 second

}

我认为发生这种情况是因为在代码继续后重新绘制了框架?所以我尝试在另一个线程上运行 for 循环,但这似乎并不重要。

如何在循环运行时让条带动画?

谢谢

【问题讨论】:

    标签: c#


    【解决方案1】:

    您可以通过在循环的每次迭代中包含对 Application.DoEvents() 的调用来简单地解决此问题。

    但这并不是实现这一目标的最佳方式。

    推荐的方法是在另一个线程中处理你的循环,比如 BackgroundWorker,让你的进度条在主线程上保持动画。

    你可以在这里得到一些解释:Keeping your UI Responsive and the Dangers of Application.DoEvents

    【讨论】:

    • 我说更多地提升BackgroundWorker。这确实是最好的方法
    • @gunr2171 最好的方法是利用async 关键字。但是,是的,BackgroundWorker 比调用 DoEvents 要好得多。
    • @DanielMann, DoEvent 正如我所见,它什么也没做。我说BackgroundWorker,因为在线程之间传递对象的框架已经存在,以及(最重要的部分)发送有关您的进度更改的状态消息。
    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2012-10-15
    相关资源
    最近更新 更多