C#调度程序计时器和系统.Timers.Timer射击过早



我在MSDN上读到,尽管计时器不能保证以确切的间隔(在我的情况下为1秒)发射,但它们不会在间隔之前发射。P>

一台PC上的计时器正常工作(Windows 7),而另一个PC(Windows Server 2003)都会发射每个0.99999936 seconds

我真的对为什么会发生这种情况感兴趣。

我注意到了这一点,因为我有代码计数秒为newSeconds = newSeconds + delta.Seconds其中 deltaDateTime.Now - lastTime

秒部分在Windows 7上显示1和Windows Server上的0

解决方案是仅阅读totalseconds,但我仍然想知道为什么它在以前发射。

任何人都可以详细说明吗?

编辑

我实际上在两个不同的Windows 2003 PC上发生了这种情况。我想知道OS之间的区域更深入,是否有区别,.NET Framework 4在7 vs 2003中有所不同吗?还是人们可能知道的其他偏差?计时器如何实现,可能是与硬件有关的问题?

与此相对:c#计时器在间隔时间之前被触发我一直在每次滴答上都在发生。不需要长时间的运行。谢谢

编辑

public void OnTick(object sender, EventArgs e)
{
    var delta = DateTime.Now - _lastTime;
    DoStuff
    _lastTime = DateTime.Now
}

此行:

newSeconds = newSeconds + delta.Seconds

可能并且可能会并且可能会越来越远离真正的措施。想象一下用码尺尺寸为1英里:您最终会漂移。

实际时间差异可能是事件开火和抓住时间之间少量时间的结果。这两个点之间必须有几个CPU周期。

我建议您使用反应性扩展。阅读此博客文章中的"全部与时间"。

最新更新