定时器间隔1000 != 1秒

本文关键字:1秒 1000 定时器 | 更新日期: 2023-09-27 17:54:02

我有一个标签,它应该显示我的计时器的秒数(或者换句话说,我有一个变量,它被添加到计时器的每间隔1)。我的计时器的间隔设置为1000,因此标签应该每秒更新一次(并且应该显示秒数)。但是标签在1秒后已经有几百个了。得到1秒的合适间隔是多少?

int _counter = 0;
Timer timer;
timer = new Timer();
timer.Interval = 1000;
timer.Tick += new EventHandler(TimerEventProcessor);
label1.Text = _counter.ToString();
timer.Start();
private void TimerEventProcessor(object sender, EventArgs e)
{
  label1.Text = _counter.ToString();
  _counter += 1;
}

定时器间隔1000 != 1秒

获得1秒的适当间隔是1000。Interval属性是以毫秒为单位的滴答之间的时间:

MSDN:计时器。间隔属性

所以,不是你设置的间隔错了。检查代码的其余部分,看看是否更改了计时器的间隔,或者多次绑定Tick事件。

Elapsed event代替Tick event

timer.Elapsed += new EventHandler(TimerEventProcessor);

并更改TimerEventProcessor方法的签名;

private void TimerEventProcessor(object sender, ElapsedEventArgs e)
{
  label1.Text = _counter.ToString();
  _counter += 1;
}

您使用TimerEventProcessor或Counter的任何其他地方?

无论如何,您不能依赖于每秒准确交付一个事件。时间可能会变化,系统不会确保平均时间是正确的。

所以你应该使用:

而不是_Counter
 // when starting the timer:
 DateTime _started = DateTime.UtcNow;
 // in TimerEventProcessor:
 seconds = (DateTime.UtcNow-started).TotalSeconds;
 Label.Text = seconds.ToString();

注意:这并不能解决TimerEventProcessor被经常调用的问题,或者_Counter被增加到经常。它只是掩盖了它,但这也是正确的做法。

已经是一个老话题了,但是我刚刚读了一篇来自微软的文章,他们提到了系统。定时器取决于操作系统。这意味着如果你使用Windows 7,并且间隔小于15毫秒,间隔将被延迟。

您使用Interval属性来确定触发Elapsed事件的频率。因为Timer类依赖于系统时钟,所以它具有与系统时钟相同的分辨率。这意味着,如果interval属性小于系统时钟的分辨率,则Elapsed事件将在由系统时钟分辨率定义的间隔内触发。下面的示例将Interval属性设置为5毫秒。当在系统时钟分辨率大约为15毫秒的Windows 7系统上运行时,该事件大约每15毫秒触发一次,而不是每5毫秒触发一次。