【问题标题】:How can I avoid timing inconsistences in a custom timer when the date/time changes?当日期/时间更改时,如何避免自定义计时器中的计时不一致?
【发布时间】:2012-08-15 08:45:28
【问题描述】:

我有一个计时器类,它使用本地机器的日期/时间来计算事情已经运行了多长时间,并设置在特定时间段后过期的计时器。

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

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

计时器/超时计时器的运行时间从几秒到几天不等。

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

【问题讨论】:

  • 试用秒表。请参阅 David Yaw 的回答。秒表也更准确。

标签: .net datetime timer c++-cli


【解决方案1】:

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

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

调整机器时钟时可能会出现许多其他问题。例如文件系统时间戳。 Linux 闰秒错误是最近发生的一个有趣事件。拥有可靠的时间源对于保持机器运转非常重要,并且可以从时间服务器轻松获得。

【讨论】:

    【解决方案2】:

    除了您找到的事件之外,您还可以使用 Stopwatch 之类的东西来代替系统时间来进行计时。

    【讨论】:

      【解决方案3】:

      在您在 SO 上发布内容之前,Google 搜索为何总是失败?如果其他人想做这样的事情,我发现有a system event which can be used

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-14
        • 1970-01-01
        • 2021-02-22
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        相关资源
        最近更新 更多