.NET中Timer的最大精度是多少?

我想知道Timer类的精度在System.Timers中是什么,因为它是一个double(这似乎表明你可以有几分之一毫秒)。 它是什么?

Windows桌面操作系统在大约40ms以下确实不准确。 操作系统根本不是实时的,因此会出现明显的非确定性抖动。 这意味着虽然它可能会将值报告到毫秒甚至更小,但您无法真正指望这些值真正有意义。 因此, 即使 Timer间隔设置为某个亚毫秒值,您也不能依赖设置和触发之间的时间实际上是您所说的。

再加上这个事实,你运行的整个框架都是非确定性的(GC可以暂停你并在Timer应该触发时进行收集)并且你最终会遇到负载和风险,试图做任何事情是时间关键。

System.Timers.Timer很奇怪。 它使用double作为间隔,但实际上在其上调用Math.Ceiling并将结果转换为int以与底层System.Threading.Timer一起使用。 它的理论精度是1ms,你不能指定超过2,147,483,647ms的间隔。 鉴于此信息,我真的不知道为什么使用double作为interval参数。

几年前我发现它准确到大约16ms ……但遗憾的是我不记得细节了。

您可以通过执行循环来轻松地找到这一点,该循环不断地对生成的持续时间进行采样并检查它所执行的粒度。

我比较了System.Timers.TimerSystem.Threading.Timer它们都会在8..16 ms左右发出系统错误,特别是在小间隔(1000..6000 ms)内。 定时器例程的每次后续调用都发生在第一次调用的间隔增加。 例如,具有2000毫秒间隔的计时器在2000,4012,6024,8036,10048毫秒等时触发(从Environment.TickCountStopwatch.ElapsedTicks获得的时间戳,两者都给出相同的结果)。

定时器分辨率下降到1ms的状态,没有太多的实施工作。 我刚刚在这个答案中描述了double精度的原因。 将系统配置为以每秒1024个中断运行时(使用多媒体计时器API),中断之间的时间为0.9765625 ms。 时间问题的标准分辨率为100ns。 这些值存储为整数。 如果不以100 ns分辨率的整数精度丢失,则无法存储值0.9765625。 最后一位(5)代表500 ps。 因此,分辨率必须高出三个数量级。 将这些时间值存储在100 ps分辨率的整数中是没有希望的,因为在100 ps分辨率下的8字节整数将包裹大约21350天或大约58年。 这段时间太短,无法被任何人接受(请记住Y2K情景!)。

查看链接的答案,了解有关详细信息的更多信息。