Из MSDN «Если нет ожидающих потоков, маркер ожидания остается сигнализируемым до тех пор, пока поток не попытается подождать на нем или пока не будет вызван его метод Reset
».AutoResetEvent Set вызывается после таймаута
EventWaitHandle MyWaitHandle = new AutoResetEvent(false);
Thread # 1:
public void Method1()
{
//do something
//wait for the signal or timeout
MyWaitHandle.WaitOne(10000);
//do something else on receiving signal or after timeout
}
Thread # 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();
}
В моем приложении Thread # 1 подав запрос на внешнее приложение и ждет сигнала или тайм-аут. Если ответ получен из внешнего приложения Thread # 2 устанавливает дескриптор ожидания. Этот set
можно вызвать даже после таймаута. Мои вопросы:
1) Очень возможно, что Method2
может быть вызван после таймаута, в результате чего устанавливается сигнал. Означает ли это, когда в будущем будет запрос на Thread # 1, WaitOne(10000)
не имеет эффекта и будет немедленно выпущен?
2) Есть ли в любом случае для меня не звонить set
в Method2
в случае перерыва? Это вызовет проблемы в Thread # 1?
Почему вы не хотите устанавливать событие даже после таймаута? Разве метод 2 не сигнализирует, что что-то готово для метода 1? Возможно, если вы объясните, что вы пытаетесь выполнить ... –
'Method2()' не знал бы, будет ли он вызываться после таймаута. Это проблема. Ну, я могу контролировать время и устанавливать переменную 'bool', чтобы узнать, является ли это тайм-аутом. Но могу ли я вызвать 'Set()' на основе значения 'bool'. Если я не позволю, он оставит какие-либо открытые ручки или что-нибудь еще? – user1178376