manualreseteevent . waitone()无超时返回false

本文关键字:超时 返回 false waitone manualreseteevent | 更新日期: 2023-09-27 18:15:57

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

我们有一个呼叫WaitOne(3600000)的电话,大约五分钟后,false返回。

在大约300个服务器中只有一个服务器出现此行为。我们还没有隔离那个特定服务器的任何不同之处。调用是在使用。net 4.0的Windows服务中进行的。

我们使用调用的代码基本上是这样的:
 if (tracker.WaitOne(timeout)) {
     Log("Success");
     return;
 }
 Log("Timed out");
 throw new Exception(...);

我们在大约五分钟后(不准确)得到"超时"日志。

注意,超时时间通常不是一小时。我们延长了测试的超时时间,因为超时时间比预期的要早。正常情况下,超时时间配置为10分钟。在绝大多数情况下,跟踪器在不到一秒钟的时间内就达到了Set(),尽管很少情况下需要几分钟。

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

manualreseteevent . waitone()无超时返回false

如果它发生在一台服务器上,并且可靠地更快地超时(5分钟而不是60分钟),我可能会认为那台机器有某种非常奇怪的时钟问题。

答案是诚实地,它不会返回false,除非超时已经过了(显然,超时是不准确的,但不应该那么远,更有可能是"晚"而不是"早"),所以要么你的断言是错误的,或者是一些东西真的真的错了服务器甚至可能是硬件级别。