c# – ManualResetEvent.WaitOne()在没有超时的情况下返回false?

除了超时之外,什么会导致ManualResetEvent.WaitOne()返回false?

我们打电话给WaitOne(3600000),大约五分钟后返回,返回false.

在大约300个服务器中只能看到这种行为.我们还没有发现有关该特定服务器的任何不同信息.该调用是在使用.NET 4.0的Windows服务中进行的.

我们使用调用的代码看起来基本上是这样的:

 if (tracker.WaitOne(timeout)) {
     Log("Success");
     return;
 }
 Log("Timed out");
 throw new Exception(...);

我们在大约五分钟后(不完全)得到“超时”日志.

请注意,超时通常不是一小时.我们延长了测试的超时时间,因为它超出了预期的时间.通常,超时配置为十分钟.在绝大多数的运行中,跟踪器是Set()在不到一秒钟内,尽管很少需要几分钟.

我还调查了是否有什么东西可以处理等待句柄但是它被处理掉的唯一地方是它被设置之后.我还检查了在set之后处理close是否会导致wait句柄错误地返回false,并且在.NET 4和.NET 4.5的测试中,即使在set之后立即调用dispose,wait句柄也总是返回true.

最佳答案 如果它发生在一台服务器上,并且可以更快地超时(5分钟而不是60分钟),我可能会认为该机器存在某种非常奇怪的时钟问题.

答案是老实说,除非超时已经过去,否则它不会返回false(显然,超时不准确,但不应该那么远,并且更可能是’迟到’而不是’早’)所以要么你的断言在某种程度上是错误的,或者甚至是硬件级别的那个服务器真正的错误.

点赞