【发布时间】:2021-02-26 22:11:24
【问题描述】:
我在控制台应用程序 (.net 4.5.2) 上做了一个小功能,以检查 AutoResetEvent.WaitOne 功能中超时的准确性。 在我的笔记本电脑上,等待时间几乎就是 WaitOne 的超时时间(右图)。 在我运行此测试的所有其他系统上,超时时间都更高(左图)。 我尝试更新 .net 但没有任何更改。
这种不同的行为是否与我的特殊硬件(联想 p52)有关,或者我正在使用 Visual Studio?
private static void WaitTest()
{
try
{
using (var lResetEvent = new AutoResetEvent(false))
{
_stopwatch.Restart();
lResetEvent.WaitOne(1);
var l1Ms = _stopwatch.ElapsedMilliseconds;
_stopwatch.Restart();
lResetEvent.WaitOne(10);
var l10Ms = _stopwatch.ElapsedMilliseconds;
_stopwatch.Restart();
lResetEvent.WaitOne(20);
var l20Ms = _stopwatch.ElapsedMilliseconds;
Console.WriteLine($"-----------------------------------------------------------");
Console.WriteLine($" 1ms WaitTest: {l1Ms:D2}ms");
Console.WriteLine($"10ms WaitTest: {l10Ms:D2}ms");
Console.WriteLine($"20ms WaitTest: {l20Ms:D2}ms");
Console.WriteLine($"-----------------------------------------------------------");
}
}
catch (Exception lEx)
{
Console.WriteLine(lEx.ToStringEx());
}
}
【问题讨论】:
-
如果您指的是不同的延迟时间,您可能需要通过 Google 搜索
timeBeginPeriod了解一些背景信息。 -
我希望这与计时器粒度不是很好的原因相同 - 它基于系统时钟的准确性。但这在该文档中没有提到。 Timer.Interval 展示了如何测量准确性。
-
您可以在 .NET 中精确测量经过的时间间隔,但是当您想在任意时间内什么都不做时,事情就不那么好了。无论您选择哪种方式,它都会非常不准确,而且您永远无法达到如此精确。
标签: c# .net console-application autoresetevent