一尘不染

Thread.Sleep(TimeSpan)有多准确?

c#

我遇到了一个单元测试,该测试间歇性地失败了,因为经过的时间不是我期望的那样。

该测试的示例如下:

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

TimeSpan oneSecond = new TimeSpan(0, 0, 1);

for(int i=0; i<3; i++)
{
    Thread.Sleep(oneSecond);
}

stopwatch.Stop();

Assert.GreaterOrEqual(stopwatch.ElapsedMilliseconds, 2999);

大多数情况下,此操作通过了,但至少有一次失败,原因是:

预期:大于或等于2999,但是:2998

我不知道怎么可能不到3秒。我不知道Thread.Sleep或Stopwatch是否存在准确性问题?

只是对以下一些问题的更新。正在单元测试的场景是一个类,该类允许我们调用一种方法来执行某些操作,如果失败,请稍等片刻,然后重新调用该方法。上面显示的测试只是正在发生的事情的近似值。

假设我想调用方法DoSomething()…但是如果DoSomething()抛出异常,我希望能够重试最多3次,但每次尝试之间要等待1秒。在这种情况下,单元测试的目的是验证当我们请求3次重试且每次重试之间有1秒等待时,总耗时大于3秒。


阅读 643

收藏
2020-05-19

共1个答案

一尘不染

您的线程正在与其他线程共享CPU时间。轮到您再次进入睡眠状态时,睡眠就会结束,内核会注意到睡眠时间已经过去,因此它不是那么准确。

CPU负载,进程优先级,并发线程数(甚至来自其他进程)也会对其产生影响。

2020-05-19