AutoResetEvent Set вызывается после тайм-аута

Из 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 отправляет запрос во внешнее приложение и ожидает сигнала или тайм-аута. Если ответ получен от внешнего приложения, Thread # 2 устанавливает дескриптор ожидания. Этот set можно вызывать даже после тайм-аута. Мои вопросы

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

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


person user1178376    schedule 06.02.2012    source источник
comment
Почему вы не хотите устанавливать событие даже после тайм-аута? Разве Method2 не сигнализирует о том, что что-то готово для Method1? Возможно, если вы объясните, чего вы пытаетесь достичь...   -  person 500 - Internal Server Error    schedule 06.02.2012
comment
Method2() не будет знать, вызывается ли он после тайм-аута. Вот в чем проблема. Что ж, я могу следить за временем и установить переменную bool, чтобы узнать, истекло ли время. Но могу ли я вызвать Set() на основе значения bool. Если я не позвоню, останутся ли открытые ручки или что-то в этом роде?   -  person user1178376    schedule 06.02.2012


Ответы (1)


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

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
}
person Chris Shain    schedule 06.02.2012