【问题标题】:How to check if the WaitHandle was set?如何检查是否设置了 WaitHandle?
【发布时间】:2010-07-22 20:24:19
【问题描述】:

我有一个WaitHandle,我想知道如何检查 WaitHandle 是否已设置。

注意:我可以添加一个 bool 变量,并在使用 Set() 方法时将变量设置为 true,但此行为必须在 WaitHandle 的某个地方构建。

感谢您的帮助!

【问题讨论】:

  • 我的答案比 SwDevMan 的答案要早几秒钟,这要清楚得多,并且包括文档引用,所以我将其删除。但是,我仍然想知道“您是否正在处理可能已经重置的自动重置事件,或者测试代码不能重置?”

标签: c# waithandle


【解决方案1】:

试试WaitHandle.WaitOne(0)

如果毫秒超时为零,则该方法不会阻塞。它测试等待句柄的状态并立即返回。

【讨论】:

  • +1 好清晰的答案。很好很简单,尽管我建议将“尝试”更改为“使用”。就目前而言,您似乎不确定自己的答案。
  • 唯一的问题是,对于某些 WaitHandles(自动重置事件,信号量),就绪状态实际上会通过等待来重置。
  • @Vivin joy - millisecondsTimeoutWaitOne 调用的参数名称,请查看链接。引用自备注部分
  • @MartinVseticka 不要害羞!我带着同样的问题来到这里。答案或许可以猜测,但绝不是不言而喻的。
  • 它不只是检查等待句柄是否为 AutoResetEvent!它实际上将其状态更改为 true。
【解决方案2】:
const int DoNotWait = 0;
                          
ManualResetEvent waitHandle = new ManualResetEvent(false);                   

Console.WriteLine("Is set:{0}", waitHandle.WaitOne(DoNotWait));
         
waitHandle.Set(); 

Console.WriteLine("Is set:{0}", waitHandle.WaitOne(DoNotWait));   

输出:

设置为:假

设置为:真

【讨论】:

  • 为什么要为变量使用关键字?这是不必要的,并且会使您的答案更难阅读。
  • @Jeff 当然,只是一些示例代码很难命名,而且我今天写了很多代码。
  • @chibacity:写事件以外的东西很容易。 waitHandleresetEventmremyEvent。这个列表是无穷无尽的,它会让你的例子更好。
  • @Jeff 你不知道我现在精神疲惫的状态——但我会遵守的! :)
  • @Jeff 干杯,你是对的。 :)
【解决方案3】:

WaitHandle 上使用Wait... 方法之一,该方法采用超时值,例如WaitOne,并传递超时0。

【讨论】:

    【解决方案4】:

    您可以使用WaitOne(int millisecondsTimeout, bool exitContext) 方法并为时间跨度传入0。它会立即返回。

    bool isSet = yourWaitHandle.WaitOne(0, true);
    

    【讨论】:

    • 他们为什么要使用带有exitContext 值的那个?考虑到存在不需要此字段的替代方案,您应该解释其必要性。
    • VS2005 的在线帮助仅显示 WaitOne()、WaitOne(int,bool) 和 WaitOne(TimeSpan,bool)。所以,很可能他们没有找到 WaitOne(int)
    猜你喜欢
    • 2016-12-05
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多