2012-08-15 45 views
0

我有一个计时器类,它使用本地计算机的日期/时间来计算事情已经运行了多长时间,并设置计时器在一段时间后过期。如何在日期/时间更改时避免自定义计时器中的计时不一致?

我发现如果用户更改系统时间,这会对我的应用程序造成严重破坏,因为定时器突然认为他们已经过期,或者他们记录的时间突然跳跃了一个小时(比如说)。

这些定时器当前通过多线程应用程序使用。

定时器/超时定时器可以运行几秒到几天。

如何避免这些时间不一致?

+0

试用秒表。请参阅David Yaw的答案。秒表也更精确。 – Paparazzi 2012-08-15 19:35:31

回答

1

您可以使用SystemEvents.TimeChanged事件来获取此通知。

您还需要考虑一下机器的时区或夏令时规则的变化。 .NET通过在检索日期时间第一次锁定区域时确保这不会对计时器造成重大干扰。换句话说,它确保定时器在其编程的时间间隔内到期,而不是绝对时间。如果这是一个问题(测试它),那么你需要通过调用CultureInfo.ClearCachedData()(对于TimeZone和DateTime)以及TimeZoneInfo.ClearCachedData()(对于TimeZoneInfo和DateTimeOffset)来显式清除该状态。

机器时钟调整时可能出错的很多其他事情。例如文件系统时间戳。 Linux闰秒是最近一个有趣的事件。有一个固定的时间源是相当重要的,以保持机器嗡嗡声,很容易从时间服务器获得。

0

谷歌搜索总是失败,直到你发布一些东西,这是怎么回事?如果其他人想要做这样的事情,我发现有a system event which can be used

1

除了发现的事件之外,您还可以使用类似Stopwatch的事件来代替系统时间。