除了超时之外,还有什么会导致 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()
,但很少需要几分钟。
我还研究了是否有什么东西可以处理等待句柄,但它唯一被处理的地方是在它被设置之后。我还检查了在设置后关闭是否会导致等待句柄错误地返回 false,并且在我对 .NET 4 和 .NET 4.5 的测试中,等待句柄总是返回 true,即使在设置后立即调用 dispose 也是如此。
最佳答案
如果它发生在一台服务器上,并且可靠地更快超时(5 分钟而不是 60 分钟),我可能会认为该机器有某种非常奇怪的时钟问题。
老实说,除非超时已经过去,否则它不会返回 false(显然,超时不准确,但不应该太远,而且更可能是“晚”而不是“早”)和因此,要么您的断言在某种程度上是错误的,要么该服务器在硬件级别上确实存在问题。
关于c# - ManualResetEvent.WaitOne() 在没有超时的情况下返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25071023/