3

这是我的代码:

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

我的意图是实时更新标签的文本,所以 if timer.ElapsedMilliseconds == 1350, then label1.Text = 1350。我怎样才能做到这一点?提前致谢!

4

4 回答 4

9

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

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

只是示例片段:

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

   private void TimerEventProcessor(...){          
     label1.Text = "...";
   }
于 2012-09-13T09:11:16.703 回答
5

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

于 2012-09-13T09:12:43.267 回答
1

这是一个 WinForms 应用程序吗?

问题是,当您的循环运行时,它不会给任何其他任务(如更新 GUI)提供任何完成的可能性,因此 GUI 将更新整个循环完成。

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

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

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

于 2012-09-13T09:12:22.987 回答
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. 您使用上述技术做了很多旋转,这可能会导致您的 UI 无响应。

于 2012-09-13T09:18:33.643 回答