我试图用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决定。