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

Ste*_*ris 13 .net c# datetime timer

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

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

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

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

Har*_*wok 5

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

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

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

  • 在许多现代(又称便宜)主板上,Stopwatch.ElapsedTicks是从芯片组时间源生成的,具有非常高的分辨率但精度很差.它不能替代使用因特网时间服务器校正而校准的时钟节拍中断的定时器.秒表仅用于比较短间隔. (2认同)
  • @Steven:CPU中有一个独立的电路,主板上还有一个专用于高分辨率时序的芯片.没有额外的开销,它不像CPU必须更频繁地运行计时器处理代码. (2认同)

Ste*_*ris 4

我只会引用吉姆·米歇尔的评论,因为这是与我的问题最相关的答案。

所有计时器都不依赖于系统时间。也就是说,用户改变时钟不会影响System.Windows.Forms.TimerSystem.Timers.Timer、 或System.Threading.Timer。也不会影响 StopwatchEnvironment.TickCount。此外,使用Stopwatch. 值并不是不断更新的。它是惰性评估的(即Ticks在引用时更新)。

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

定时器是类似的。System.Threading.Timer基于 Windows 定时器队列定时器。请参阅该文档。System.Timers.Timer 只是 .Timer 的包装System.Threading.TimerSystem.Windows.Forms.Timer是 WindowsSetTimerKillTimer函数的包装器。这些文件表明它们不依赖于系统时间。