WaitHandle WaitOne Return

本文关键字:Return WaitOne WaitHandle | 更新日期: 2023-09-27 18:16:13

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向发出信号的方法。

WaitHandle WaitOne Return

"我想在调用线程等待时基本上停止阻塞,甚至在 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 的合适方法。

如果上述内容不能解决您的问题,请通过提供一个好的、最小的完整的代码示例来改进问题,该示例清楚地说明了场景,并详细说明了该代码示例现在的作用以及它与您希望它执行的操作有何不同。