Ich versuche, einen Zeitdienst zu implementieren, der Zeit mit größerer Genauigkeit als 1ms meldet. Ich dachte, eine einfache Lösung wäre, eine erste Messung durchzuführen und StopWatch zu verwenden, um ein Delta hinzuzufügen. Das Problem ist, dass diese Methode extrem schnell von der Wandzeit abzuweichen scheint. Zum Beispiel versucht der folgende Code die Divergenz zwischen Wand Zeit und meiner Hohen Auflösung Uhr zu messen:Der beste Weg, um eine hohe Auflösung DateTime.UtcNow in C# zu implementieren?
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);
}
}
Ich divergierend mit einer Rate von etwa 2 ms/Minute auf relativ neue Sever-Hardware.
Gibt es eine andere Zeitfunktion in Windows, von der ich nicht weiß, dass sie genauer ist? Wenn nicht, gibt es einen besseren Ansatz zum Erstellen einer Uhr mit hoher Auflösung oder einer 3rd-Party-Bibliothek, die ich verwenden sollte?
Frage: Wenn 'DateTime.UtcNow' nicht genau genug für Sie ist, was werden Sie verwenden, um Ihren Zeitdienst zu erstellen? – StriplingWarrior
Zusätzlich zu @ Hans 'großer Antwort würde ich hinzufügen, dass Sie versuchen könnten, dies mit einem Hardwaregerät (etwas mit "einem teuren Quarzoszillator") zu erreichen. Ich bin mir nicht sicher, ob Sie Sub-ms-Zeit auf einer Windows-Box übertragen und nutzen können. –