哪些计时器依赖于系统时间?

我还没有测试过这个。 我希望有人已经知道答案,所以我不必编写测试应用程序,否则我会。 🙂

通常当我想比较时间时,我只是存储DateTime.Now并在以后比较它。 我相信当用户在两者之间的某个地方更改用户的系​​统时间时,这会产生错误的结果。

这让我想知道计时器的行为方式是否相同。 哪些.NET计时器依赖于设置的系统时间? 考虑启动一个需要在一小时内过去的计时器。 当我将系统时间设置为前进一小时时会触发吗?

我从来没有真正关心这种可能的行为,但在某些情况下这可能很重要。 哪个计时器可以安全地对付这种情况,哪些计时器绝对不是?

我试图解决类似的问题。 我结果使用System.Diagnostic.StopWatch来替换所有DateTime.Now 。 如果存在, StopWatch将使用高频时钟。 因此,它更准确,独立于系统时钟变化。 但是,如果不存在高频时钟,它将再次回退使用系统时钟。

根据我的测试,我的所有机器都有高频时钟,包括VM中的机器。

关于Timer,据我记忆,它不依赖于系统时钟。 但是,您实际上并不想使用Timer来跟踪时间,因为Timer回调事件可能会被某些其他事件推迟。

我只会引用Jim Mischel的评论 ,因为这是我问题最相关的答案。

所有计时器都不依赖于系统时间。 也就是说,更改时钟的用户不会影响System.Windows.Forms.TimerSystem.Timers.TimerSystem.Threading.Timer 。 它也不会影响StopwatchEnvironment.TickCount 。 此外,使用Stopwatch没有“开销”。 这不是价值不断更新。 它被懒惰地评估(即Ticks被引用时更新)。

Stopwatch文档说:“ Stopwatch通过计算基础计时器机制中的计时器滴答来测量经过的时间。如果安装的硬件和操作系统支持高分辨率性能计数器,则Stopwatch类使用该计数器来测量经过的时间。” 如果您在高分辨率性能计数器上查找信息,您将看到它不依赖于系统时间

计时器很相似。 System.Threading.Timer基于Windows计时器队列计时器。 查看该文档。 System.Timers.Timer只是System.Threading.Timer的包装器。 System.Windows.Forms.Timer是Windows SetTimerKillTimer函数的包装器。 这些文档表明它们不依赖于系统时间。