AutoResetEvent Set вызывается после истечения времени ожидания - PullRequest
1 голос
/ 06 февраля 2012

Из MSDN «Если нет ожидающих потоков, дескриптор ожидания остается сигнальным до тех пор, пока поток не попытается ожидать его или пока не будет вызван его метод Reset."

EventWaitHandle MyWaitHandle = new AutoResetEvent(false);

Поток # 1:

public void Method1()
{
  //do something
  //wait for the signal or timeout
  MyWaitHandle.WaitOne(10000);
  //do something else on receiving signal or after timeout
}

Тема # 2:

//this would be called when there is a response from the external app
public void Method2()
{
  //do something
  //send the signal to waiting thread
  MyWaitHandle.Set();
}

В моем приложении Тема # 1 отправляет запрос во внешнее приложение и ожидает сигнала или тайм-аута.Если ответ получен из внешнего приложения, поток № 2 устанавливает дескриптор ожидания.Этот set может быть вызван даже после истечения времени ожидания.Мои вопросы

1) Весьма вероятно, что Method2 может быть вызван после истечения времени ожидания, что приведет к настройке сигнала.Означает ли это, что когда-нибудь в будущем появится запрос к потоку № 1, WaitOne(10000) не будет иметь эффекта и будет немедленно освобожден?

2) В любом случае я могу не вызывать set в Method2 в случае тайм-аута?Может ли это вызвать какие-либо проблемы с темой № 1?

1 Ответ

2 голосов
/ 06 февраля 2012

Почему бы просто не убедиться, что ручка ожидания всегда сбрасывается, прежде чем ждать на ней?

public void Method1()
{
  // Reset the wait handle I'll be using...
  MyWaitHandle.Reset();

  //do something
  //wait for the signal or timeout
  MyWaitHandle.WaitOne(10000);
  //do something else on receiving signal or after timeout
}
...