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

时间:2011-02-26 16:12:27

标签: c# .net datetime timer

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

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

我只是 quote Jim Mischel comments,因为它是我问题最相关的答案。

  

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

     

Stopwatch的文档说:“Stopwatch测量已用时间   通过计算基础计时器机制中的计时器滴答。如果   安装的硬件和操作系统支持高分辨率   性能计数器,然后Stopwatch类使用该计数器   测量经过的时间。“如果你查看高分辨率的信息   性能计数器,你会发现它不依赖于系统   时间

     

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

答案 2 :(得分:0)

在 RPi 零上,这是我所看到的: 如果您更改系统时钟,Thread.Sleep 将停止。如果 time 设置为当前时间之前的值,然后您再次将其设置回来,则 Sleep 将不再起作用。如果您将时间设置为过去的某个时间,然后再次设置为当前时间,它将按预期工作。