WaitHandle WaitOne返回

时间:2015-10-06 00:51:16

标签: c# multithreading .net-4.5 waithandle waitone

WaitHandle WaitOne(int timeout)何时返回?超时过去后它会返回吗?我看到一些在线代码建议在实现逻辑时轮询WaitOne(),在退出之前进行一些清理。这意味着当超时超时时WaitOne()不会返回;相反,它会在它被调用后立即返回它。

public void SomeMethod()
{
  while (!yourEvent.WaitOne(POLLING_INTERVAL))
  {
    if (IsShutdownRequested())
    {
      // Add code to end gracefully here.
    }
  }
  // Your event was signaled so now we can proceed.
}

我在这里尝试实现的是一种在WaitHandle阻止调用线程时使用CancellationToken发出信号的方法。

1 个答案:

答案 0 :(得分:1)

"我想基本上在WaitHandle超时或发出信号之前等待调用线程时阻止调用线程" - 在什么条件下你想要线程到变得畅通无阻?您是否已经使用了CancellationToken对象?

如果是这样,那么你可以这样做:

public void SomeMethod(CancellationToken token)
{
  int waitResult;

  while ((waitResult = WaitHandle.WaitAny(
      new [] { yourEvent, token.WaitHandle }, POLLING_INTERVAL)) == WaitHandle.WaitTimeout)
  {
    if (IsShutdownRequested())
    {
      // Add code to end gracefully here.
    }
  }
  if (waitResult == 0)
  {
      // Your event was signaled so now we can proceed.
  }
  else if (waitResult == 1)
  {
      // The wait was cancelled via the token
  }
}

请注意,使用WaitHandle并不一定是理想的。 .NET具有现代的托管线程同步机制,比WaitHandle(基于本机操作系统对象产生更大的开销)更有效。但是,如果您必须使用WaitHandle开头,则上述内容可能是将当前实现扩展为使用CancellationToken的合适方式。

如果上述问题无法解决您的问题,请通过提供明确说明该方案的a good, minimal, complete code example来改进问题,并详细说明该代码示例现在所执行的操作以及与此类似的方法与你想要它做什么。