【发布时间】:2012-08-16 07:10:38
【问题描述】:
我希望在我的 C# 应用程序中更改 Windows 系统日期/时间时收到通知。我找到了SystemEvents.TimeChanged 事件,MSDN 文档对此表示:
当用户更改系统时钟的时间时发生。
如果时钟被 NTP 更改,此事件是否也会被触发?或者我可以订阅其他活动吗?
实现细节:
我希望 timer.Elapsed 事件在特定日期/时间触发。我的代码计算用于计时器所需的时间间隔。如果系统时间发生变化,则需要重新评估此计算以计算出新的时间间隔并更新计时器。
答案摘要
感谢所有 cmets。我将它们总结在下面以供将来参考:
- SystemEvents.TimeChanged 在用户更改和系统调用与 NTP 服务器重新同步时触发
- 如果在 Windows 服务中运行,则需要处理消息泵以获取 TimeChanged 事件。这可以通过运行调度程序来实现。
- NTP 服务器不应用离散的系统日期更改。逐步应用 NTP 时钟调整,同时考虑到计算的时钟漂移以及本地时钟与其他 NTP 服务器之间的偏移
- 对于我的实现,最好定期评估计时器间隔以考虑任何系统时间更改,而不是设置一次间隔并让它触发。
【问题讨论】:
-
WM_TIMECHANGE - msdn.microsoft.com/en-us/library/windows/desktop/…
-
感谢@StuartDunkeld,我刚刚查看了 Reflector 中的 SystemEvents,并且 TimeChanged 事件在内部使用了 WindowProc 本机方法。这是否意味着 SystemEvents.TimeChanged 将被调用任何时间更改事件?
-
如果每次 NTP 服务器调整时间时您都期待一个事件,我怀疑您会得到一个。 NTP 通过减慢或加快时钟连续调整时钟,同时考虑到计算的时钟漂移以及本地时钟与其他 NTP 服务器之间的偏移。这些调整不是离散的跳跃,而是摆动。见stackoverflow.com/questions/7497242/…
-
谢谢@Celada。这是否意味着使用上面的实现是安全的?还是我应该定期重新评估下一个间隔以获得更好的准确性?
-
NTP 时钟调整逐渐应用,通常以每个时钟中断 100 纳秒的速率进行。它可以补偿闰秒和时钟漂移,而不会扰乱依赖时钟稳定提前的过程。有关详细信息,请参阅 MSDN 文章 GetSystemTimeAdjustment()。