私は1msよりも正確に時間を報告するタイムサービスを実装しようとしています。簡単な解決策は、初期測定を行い、StopWatchを使ってデルタを追加することだと思いました。問題は、この方法が壁の時間から非常に速く発散しているように見えることです。たとえば、次のコードは、ウォール時間と私の高分解能クロックの乖離を測定しようとします。C#で高解像度のDateTime.UtcNowを実装する最も良い方法は?
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ミリ秒/分の速度で発散しています。
私はそれがより正確になることに気づいていない別の時間機能がウィンドウにありますか?そうでない場合は、高解像度の時計や私が使用するはずのサードパーティライブラリを作成する方が良いでしょうか?
質問: 'DateTime.UtcNow'があなたのために十分正確でない場合、あなたはあなたのタイムサービスをシードするために何を使用しますか? – StriplingWarrior
@ Hansの偉大な答えに加えて、ハードウェアデバイス( "高価な水晶発振器"のもの)を使ってこれを達成しようとするかもしれないと付け加えたいと思います。 Windowsのボックスでサブミス時間を転送できるかどうかは分かりません。 –