我试图用8000个ticks(1个tick=100ns,因此8000个ticks等于0.8ms或800us)启动TimeSpan来创建间隔小于1毫秒的循环:

    private static void MeasureAutoResetEvent()
    {
        TimeSpan interval = new TimeSpan(8000L); // 800us
        double elapsed = 0;
        Stopwatch watch = new Stopwatch();
        AutoResetEvent autoResetEvent = new AutoResetEvent(false);

        while (true)
        {
            watch.Restart();
            autoResetEvent.WaitOne(interval);
            watch.Stop();
            elapsed = ResolveTicks(UoM.Microsecond, watch.ElapsedTicks);

            Console.WriteLine(elapsed); // <- Does not writes ±800
        }
    }

UoM枚举和ResolveTicks()方法定义如下:
    public enum UoM
    {
        Second,
        Millisecond,
        Microsecond,
        Nanosecond,
    }

    public static double ResolveTicks(UoM uom, long ticks)
    {
        return
            uom == UoM.Millisecond ? ticks * 1e3 / Stopwatch.Frequency :
            uom == UoM.Microsecond ? ticks * 1e6 / Stopwatch.Frequency :
            uom == UoM.Nanosecond ? ticks * 1e9 / Stopwatch.Frequency :
            ticks * 1 / Stopwatch.Frequency;
    }

我用Stopwatch来测量autoResetEvent.WaitOne(interval);使用的时间。但是,控制台上的输出不写入±800。有人知道我上面的密码怎么了吗?

最佳答案

这里的问题是.WaitOne()只精确到5到20毫秒(一般来说)。
所以,当然,如果你想等800美元,那就离得太远了。
.WaitOne()的分辨率由电流Windows Timer Resolution决定。

10-04 13:30