2012-02-06 3 views
1

Из 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?

+0

Почему вы не хотите устанавливать событие даже после таймаута? Разве метод 2 не сигнализирует, что что-то готово для метода 1? Возможно, если вы объясните, что вы пытаетесь выполнить ... –

+0

'Method2()' не знал бы, будет ли он вызываться после таймаута. Это проблема. Ну, я могу контролировать время и устанавливать переменную 'bool', чтобы узнать, является ли это тайм-аутом. Но могу ли я вызвать 'Set()' на основе значения 'bool'. Если я не позволю, он оставит какие-либо открытые ручки или что-нибудь еще? – user1178376

ответ

2

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

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 
} 
Смежные вопросы