mez*_*oid 16 c# multithreading sleep stopwatch
我遇到了间歇性失败的单元测试,因为经过的时间不是我预期的.
此测试的示例如下:
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);
Run Code Online (Sandbox Code Playgroud)
这种情况大部分时间都过去了,但至少有一次失败,因为:
预期:大于或等于2999但是:2998
我不明白它怎么可能不到3秒钟.我不知道Thread.Sleep或者Stopwatch是否存在准确性问题?
正如以下一些问题的更新.正在进行单元测试的场景是一个类,它允许一个方法调用一个方法来执行某些操作,如果它失败则等待一秒并调用该方法.上面显示的测试只是对正在发生的事情的近似.
假设我想调用方法DoSomething()...但是如果DoSomething()抛出异常,我希望能够重试最多调用它3次,但每次尝试之间等待1秒.在这种情况下,单元测试的目的是验证当我们请求3次重试,每次重试之间等待1秒钟时,所花费的总时间大于3秒.
Hav*_*ard 15
您的线程与其他线程共享CPU时间.睡眠将在你再次轮到你的时候结束,并且内核注意到睡眠时间已经过去,所以它不那么准确.
CPU负载,进程优先级,并发线程数,甚至来自其他进程,都会对它产生影响.