我正在使用DateTime.UtcNow来测量我的软件中的时间,并且需要能够判断“动作a”是否在“动作b”之后的10秒内发生。
但是如果系统时间发生了变化呢? 那么我该如何检测系统时间是否改变?
我不希望使用秒表,因为我们需要在具有多个cpu的服务器上运行,请参阅http://kristofverbiest.blogspot.com/2008/10/beware-of-stopwatch.html
我也需要应付虚拟机暂停和重新启动,所以“滴答计数”不太可能对我有用。
如何在.NET中加载插件?
如何为商业Windows应用程序创buildtesting环境?
在.NET中的任务栏中右键单击应用程序菜单
用于Mac或Linux的.NET反编译器
如何最大限度地减lessWindows内存使用量
在C#中我的程序注销部分错误,我可以得到一些帮助吗?
通过远程桌面提高WPF应用程序的速度?
Windows:列出并启动与扩展名关联的应用程序
我可以使用没有.NET库的Windows身份validation使用WCF REST服务吗?
将VS MBCS源代码expression式转换为Unicode
您可以使用SystemEvents.TimeChanged事件来检测更改的时间。 但是,如果你有一个消息泵运行,这将只会触发 – 这对Windows客户端应用程序是适当的,但对于大多数服务器应用程序(如服务,Web应用程序等)没有这么多。
否则,你可以使用Environment.TickCount – 它没有优秀的分辨率,但如果你的“10秒”可以“近10秒”,你可能没问题。 就虚拟机的限制而言,请注意,TickCount在机器运行足够长的时间后会翻转,因此您必须以任何方式处理该问题,可能需要使用DateTime.UtcNow完整性检查。
我会使用两者的组合 – 但是请注意,除了检查一些已知精确的外部时间服务器(这将具有性能影响),无论如何将在VM中工作,没有绝对准确的方法…确保你在花费更多的时间之前确定什么是“可靠的”,而不是问题的价值。
我仍然会建议使用StopWatch 。 如果“ 小心QueryPerformanceCounter”中描述的问题仍然存在,则只能说几毫秒的差异。 如果你担心负面的时间(我从来没有见过的东西,我使用StopWatch很多时间一些相当小的时间间隔),然后将-1毫秒和-1,000毫秒之间的任何东西都视为零。
使用DateTime.Now或DateTime.UtcNow进行任何类型的计时,如果有人在计算机上更改日期/时间,将会导致麻烦。 你必须使用完全内部的东西,不能改变。 StopWatch是我找到的最可靠的一个。
您可以使用SystemEvents类的TimeChanged事件在运行时检测系统时钟的更改:
http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.timechanged.aspx
这依赖于你的应用程序有一个消息循环(我假设,因为WM_TIMECHANGED消息需要处理),所以你将需要一个隐藏的形式,如果它是一个无头应用程序,如Windows服务。
至于检测系统时钟的变化,而您的应用程序因为处于暂停的虚拟机而被暂停 – 所有的赌注都是真正的可靠的解决方案。 您可以定期记录上次执行支票的时间,并确保时间不会倒退。 无论如何,挂起和恢复VM可能需要十秒以上的时间。
我会比较两个时间间隔之间的系统时间差异与单调时钟。 如果差别大于某些偏差,那么比在别的机器上更改日期和时间的偏差要大一些
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。