我可以使用计时器每x毫秒更新一次标签

时间:2012-09-13 09:08:44

标签: c# timer stopwatch

这是我的代码:

Stopwatch timer = new Stopwatch();
timer.Start();
while (timer.ElapsedMilliseconds < 3000) {
    label1.Text = Convert.ToString( timer.ElapsedMilliseconds );
}
timer.Stop();

我的目的是实时更新标签的文字,如果是timer.ElapsedMilliseconds == 1350,那么label1.Text = 1350。我怎样才能做到这一点?提前谢谢!

4 个答案:

答案 0 :(得分:9)

您最好使用System.Windows.Forms.Timer,而不是Stopwatch()

即使该计时器的准确性不如StopWatch(..),它也能为您提供良好的控制。

只是示例片段:

   myTimer.Tick += new EventHandler(TimerEventProcessor);       
   myTimer.Interval = 1350;
   myTimer.Start();

   private void TimerEventProcessor(...){          
     label1.Text = "...";
   }

答案 1 :(得分:5)

你不能像这样在紧密循环中更新UI,因为当UI线程运行该代码时,它没有响应绘制事件。你可以做一些讨厌的事情,比如“DoEvents()”,但请不要......最好只有一个Timer并在定时器事件触发时定期更新UI;我个人去的每50分钟是最快的。

答案 2 :(得分:1)

这是一个WinForms应用程序吗?

问题在于,当你的循环运行时,它不会给任何其他任务(比如更新GUI)任何可能性,所以GUI将更新整个循环完成。

您可以在此处添加快速且“脏”的解决方案(如果是WinForms)。像这样修改你的循环:

while (timer.ElapsedMilliseconds < 3000) {
  label1.Text = Convert.ToString( timer.ElapsedMilliseconds );
  Application.DoEvents();
}

现在标签应该在循环运行之间更新。

答案 3 :(得分:1)

如果您希望每秒更新一次,可以在while循环中使用模数运算符:

Stopwatch timer = new Stopwatch();

timer.Start();

while (timer.ElapsedMilliseconds < 3000) {
    if (timer.ElapsedMilliseconds % 1000 == 0)
    {
        label1.Text = timer.ElapsedMilliseconds.ToString();
    }
}

timer.Stop();

模数运算符给出除法运算的余数,如果毫秒是1,000的倍数,它将返回0。

我可能会考虑使用Timers。你使用上述技术做了很多旋转,这可能会导致你的用户界面无法响应。