更新标签时程序挂起For循环

时间:2011-02-07 09:15:53

标签: c# .net winforms for-loop hang

我在winform应用程序中有这个代码:

for (int i = 1; i <= 20; i++)
 {
      lbl.Text = i.ToString();
      Thread.Sleep(100);
 }

我希望看到标签从1到20进展,但它只是在for循环运行时挂起,然后显示20,即我看不到1-19。

为什么会有这样的方法来快速更新标签文本,类似于模拟时钟上的毫秒数(我不是制作时钟,只是一个例子。)

由于

* 编辑:如果我有一个事件按钮增加数字而没有Thread.Sleep但是我有一个beginInvoke来播放一个wav文件*

4 个答案:

答案 0 :(得分:4)

你正在睡觉gui线程,所以在gui再次更新睡眠之前。

尝试使用刻度为100毫秒的计时器

答案 1 :(得分:3)

在睡眠前调用Application.DoEvents();,这将处理队列中的所有消息:

for (int i = 1; i <= 20; i++)
 {
      lbl.Text = i.ToString();
      Application.DoEvents();
      Thread.Sleep(100);
 }

答案 2 :(得分:2)

应用程序挂起,你只看到20只是因为这似乎是在UI线程上执行而你是Sleep,因此阻塞了窗口消息循环。但是,即使不是这种情况,你很可能只会看到20,因为循环执行得如此之快。

使用System.Threading.Timer执行每x毫秒,并通过在UI线程上调用适当的方法来更新标签。

以下文章演示了如何实现您可能想要的内容(虽然在WPF环境中,但原理是相同的 - 使用ISynchronizeInvoke表示WinForms,而不是WPF中显示的Dispatcher

Timer callback closes WPF app (DispatcherTimer works..)

答案 3 :(得分:0)

使用定时器控件

int i=0;
     private void timer_Tick(object sender, EventArgs e)
            {
                if(i <=20)
                { 
                    lbl.Text = i.ToString(); 
                } 
             i++;
            }

根据需要设置TimerInterval(间隔1000 = 1秒)