定时器不准的解决办法

解决定时器在Windows上不准的问题,主要是高精度时钟不准确的问题。

Windows 10:默认系统时钟分辨率为 15.625ms(64Hz)。Task.Delay(1) 被对齐到最近的时钟刻度,实际延时 ~12-15ms(测试数据:13.0369ms、14.4563ms)。
Android:定时器分辨率通常为 10-20ms(视设备和系统版本),Task.Delay(1) 可能延时 10-20ms,受功耗优化(如 Doze 模式)影响。
需要使用更高精度的硬件时钟,计时:Stopwatch.GetTimestamp 和 GetElapsedTime 使用硬件时钟(纳秒级精度)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
await Task.Run(async() => 
{
    int k = 0;
    int n = 100;
    int m = 60;
    int millisecond = 5;

    var _stopwatch = Stopwatch.StartNew();
    for (int i = 0; i < 200 * 60; i++)
    {
        var start = Stopwatch.GetTimestamp();
        while (Stopwatch.GetElapsedTime(start).TotalMilliseconds < millisecond)
        {
            Thread.SpinWait(10);
        }
        _dataPoints.Add(m_dataPoints[k++]);
    }
    _stopwatch?.Stop();
    await Task.Delay(100);
    Debug.WriteLine($"Total: {_stopwatch.Elapsed.TotalSeconds}");
});
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy