Tôi đang cố gắng triển khai dịch vụ thời gian sẽ báo cáo thời gian có độ chính xác cao hơn 1ms. Tôi nghĩ rằng một giải pháp dễ dàng sẽ là để có một đo lường ban đầu và sử dụng StopWatch để thêm một đồng bằng với nó. Vấn đề là phương pháp này dường như phân kỳ cực nhanh từ thời gian tường. Ví dụ, đoạn mã sau cố gắng để đo sự phân kỳ giữa tường Thời gian và Nghị quyết Clock cao của tôi:Cách tốt nhất để triển khai DateTime.UtcNow có độ phân giải cao trong C#?
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);
}
}
Tôi đang phân kỳ với tốc độ khoảng 2ms/phút trên phần cứng sever khá gần đây.
Có cơ sở thời gian nào khác trong cửa sổ mà tôi không biết điều đó sẽ chính xác hơn không? Nếu không, có cách nào tốt hơn để tạo đồng hồ có độ phân giải cao hoặc thư viện của bên thứ ba mà tôi nên sử dụng không?
Câu hỏi: Nếu 'DateTime.UtcNow' không đủ chính xác cho bạn, bạn sẽ sử dụng dịch vụ thời gian nào để sử dụng dịch vụ thời gian của mình? – StriplingWarrior
Ngoài câu trả lời tuyệt vời của @ Hans tôi sẽ thêm rằng bạn có thể cố gắng thực hiện điều này bằng thiết bị phần cứng (một thứ có "bộ dao động tinh thể đắt tiền"). Tôi không chắc chắn nếu bạn có thể chuyển [và sử dụng] thời gian phụ ms trên một hộp Windows. –