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

标签 c# .net

除了超时之外,还有什么会导致 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/

相关文章:

c# - 搜索功能在 Asp.net Core 中不起作用

c# - 将字节数组转换为数字字符串 [c#]

c# - 伊达 :Domain un-used setting?

c# - Javascript和c#之间的编解码

.net - 如何解决 Failed to add reference to 'Microsoft.WITDataStore' ?

c# - 如何强制 Asp.net 3.5 菜单控件呈现为 UL 列表项

c# - 自动实现的属性和序列化

c# - 如何从其文件夹外执行 .exe

c# - 其他开发人员如何知道类库正在使用 app.config?还是我应该删除 app.config?

c# - 为什么当返回类型为 Task<string> 时该方法返回一个字符串?