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 ответ

Решение

"Я хочу по существу прекратить блокировку вызывающего потока, пока он ожидает даже до истечения времени ожидания или сигнала 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,

Если вышеизложенное не решает ваш вопрос, пожалуйста, улучшите его, предоставив хороший, минимальный, полный пример кода, который ясно иллюстрирует сценарий, вместе с подробным объяснением того, что этот пример кода делает сейчас и как это отличается от того, что вы хотите сделать.

Другие вопросы по тегам