ManualResetEvent WaitOne(timeout)提前返回。有什么想法吗?

时间:2010-10-18 17:42:18

标签: c# .net multithreading

我正在使用ManualResetEvent WaitOne(timeout)方法并将超时值设置为30ms。

我使用WaitOne两侧的log4net进行日志记录。日志消息显示WaitOne仅在等待22ms后返回false。什么会导致这个?一个.Net bug?

提前致谢。

4 个答案:

答案 0 :(得分:3)

从.NET方法最终使用的等待函数的Win32文档(http://msdn.microsoft.com/en-us/library/ms687069.aspx):

  

等待功能和超时间隔

     

指定超时的准确性   间隔取决于分辨率   系统时钟。系统时钟   以固定的速度“嘀嗒”。如果   超时间隔小于   解析系统时钟,   等待可能会超过时间   指定的时间长度。如果   超时间隔大于1   嘀嗒但不到两个,等待即可   在一到两个刻度之间,   等等。

答案 1 :(得分:1)

事件早期发出信号,或者您有定时器不准确性,因为系统时钟默认精确到15.625毫秒。

答案 2 :(得分:0)

一般来说,不要过分依赖超时。它们大致正确,不一定完美。出于同样的原因,您不应该依赖于Thread.Sleep()之类的调用来进行计时,操作系统不能确保这些调用完全正确。

答案 3 :(得分:0)

在.NET内部,来自.NET的WaitOne方法调用Windows WaitOne方法。这不是一个错误,而是正常的Windows行为。