【问题标题】:ManualResetEvent WaitOne(timeout) returns early. Any ideas why?ManualResetEvent WaitOne(timeout) 提前返回。任何想法为什么?
【发布时间】:2010-10-19 01:52:55
【问题描述】:

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

我在 WaitOne 的任一侧使用 log4net 登录。日志消息显示 WaitOne 在仅等待 22 毫秒后返回 false。什么会导致这个? .Net 错误?

提前致谢。

【问题讨论】:

  • 我也遇到了同样的问题。像微软这样的公司会发布一款计时器准确率仅为 75% 的产品,这太荒谬了。

标签: c# .net multithreading


【解决方案1】:

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

等待函数和超时间隔

指定超时的准确性 间隔取决于分辨率 系统时钟。系统时钟 以恒定的速率“滴答”。如果 超时间隔小于 系统时钟的分辨率, 等待可能会在少于 规定的时间长度。如果 超时间隔大于一 勾选但小于2,等待即可 在一到两个刻度之间的任何地方, 等等。

【讨论】:

  • +1 正在寻找关于此的 MSDN 文章,你比我成功了
【解决方案2】:

要么是事件提前发出信号,要么是你的计时器不准确在其中发挥了作用,因为默认情况下,系统时钟仅精确到 15.625 毫秒。

【讨论】:

    【解决方案3】:

    一般来说,确切地说,不要依赖超时。它们将是大致正确的,不一定是完美的。出于同样的原因,你不应该依赖像 Thread.Sleep() 这样的调用来进行计时,操作系统不能确保这些调用的计时准确

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-16
        • 1970-01-01
        相关资源
        最近更新 更多