-1

具体什么时候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

4

1 回答 1

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(基于会产生更大开销的本机 OS 对象)。但是,如果您必须首先使用WaitHandle,那么上面可能是扩展您当前的实现以使用CancellationToken.

如果以上内容不能解决您的问题,请通过提供一个清晰说明场景的良好、最小完整的代码示例来改进问题,并详细说明该代码示例现在的作用以及与您想要的有何不同去做。

于 2015-10-06T07:07:06.120 回答