Из 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?
Method2()
не будет знать, вызывается ли он после тайм-аута. Вот в чем проблема. Что ж, я могу следить за временем и установить переменнуюbool
, чтобы узнать, истекло ли время. Но могу ли я вызватьSet()
на основе значенияbool
. Если я не позвоню, останутся ли открытые ручки или что-то в этом роде? - person user1178376   schedule 06.02.2012