我还没有测试过这个。我希望有人已经知道了答案,这样我就不必写测试应用程序了,否则我会写的。:)
通常,当我想要比较时间时,我只是存储DateTime.Now
,并在以后比较它。我相信当用户在两者之间的某个地方更改用户的系统时间时,这会给出错误的结果。
这让我想知道计时器是否也是这样的。哪些.NET计时器取决于设置的系统时间?考虑启动一个计时器,该计时器需要在一个小时内过去。当我将系统时间设置为提前一个小时时,它会触发吗?
我从来没有真正关心过这种可能的行为,但它在某些情况下可能很重要。对于这种情况,哪些计时器是安全的,哪些是绝对不安全的?
发布于 2012-09-20 08:50:45
我将直接使用 quote Jim Mischel comments,因为这是与我的问题最相关的答案。
所有计时器都不依赖于系统时间。也就是说,用户更改时钟不会影响
System.Windows.Forms.Timer
、System.Timers.Timer
或System.Threading.Timer
。它也不会影响Stopwatch
或Environment.TickCount
。而且,使用Stopwatch
没有“开销”。值并不是不断更新的。它被懒惰地评估(即Ticks
在被引用时被更新)。
Stopwatch
的文档说:“Stopwatch
通过对底层计时器机制中的计时器节拍进行计数来测量经过的时间。如果安装的硬件和操作系统支持高分辨率的性能计数器,那么Stopwatch
类将使用该计数器来测量经过的时间。”如果你在高分辨率性能计数器上查找信息,你会发现它并不依赖于系统时间
计时器是相似的。System.Threading.Timer
基于Windows计时器队列计时器。请参阅该文档。System.Timers.Timer只是System.Threading.Timer
的一个包装器。System.Windows.Forms.Timer
是Windows SetTimer
和KillTimer
函数的包装器。这些文档表明它们不依赖于系统时间。
发布于 2011-02-26 16:22:37
我也在尝试解决类似的问题。我转而使用System.Diagnostic.StopWatch
来取代所有的DateTime.Now
。StopWatch
将使用高频时钟(如果存在)。因此,它更准确,并且不受系统时钟变化的影响。但是,如果高频时钟不存在,它将回退以再次使用系统时钟。
根据我的测试,我所有的机器都有高频时钟,包括VM中的机器。
关于计时器,据我所知,它并不依赖于系统时钟。但是,您并不是真的想使用Timer来跟踪时间,因为Timer回调事件可能会被其他一些事件延迟。
发布于 2021-02-03 08:49:12
在RPi Zero上,这是我所看到的:如果您更改系统时钟,Thread.Sleep将停止。如果将时间设置为当前时间之前的某个值,然后再次将其设置回来,则睡眠将不再起作用。如果您将时间设置为过去的某个时间,然后再次设置为当前时间,它将按预期工作。
https://stackoverflow.com/questions/5128027
复制