【发布时间】:2013-11-01 21:27:12
【问题描述】:
我正在尝试实现一个时间服务,它会以超过 1 毫秒的精度报告时间。我认为一个简单的解决方案是进行初始测量并使用 StopWatch 为其添加增量。问题在于,这种方法似乎与挂壁时间的分歧极快。例如,以下代码尝试测量挂钟时间和我的高分辨率时钟之间的差异:
public static void Main(string[] args)
{
System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
DateTime baseDateTime = DateTime.UtcNow;
s.Start();
long counter = 0;
while(true)
{
DateTime utcnow = DateTime.UtcNow;
DateTime hpcutcnow = baseDateTime + s.Elapsed;
Console.WriteLine(String.Format("{0}) DT:{1} HP:{2} DIFF:{3}",
++counter, utcnow, hpcutcnow, utcnow - hpcutcnow));
Thread.Sleep(1000);
}
}
我在最近的服务器硬件上以大约 2 毫秒/分钟的速度发散。
Windows 中是否还有其他我不知道的时间设施会更准确?如果没有,是否有更好的方法来创建我应该使用的高分辨率时钟或第 3 方库?
【问题讨论】:
-
问题:如果
DateTime.UtcNow对你来说不够准确,那么你会用什么来播种你的时间服务? -
除了@Hans 的出色回答之外,我还要补充一点,您可能会尝试使用硬件设备(带有“昂贵的晶体振荡器”的东西)来完成此操作。我不确定您是否可以在 Windows 机器上传输 [并利用] 亚毫秒时间。