AutoResetEvent Reset natychmiast po ustawieniu
Rozważmy następujący wzór:
private AutoResetEvent signal = new AutoResetEvent(false);
private void Work()
{
while (true)
{
Thread.Sleep(5000);
signal.Set();
//has a waiting thread definitely been signaled by now?
signal.Reset();
}
}
public void WaitForNextEvent()
{
signal.WaitOne();
}
Celem tego wzorca jest umożliwienie konsumentom zewnętrznym oczekiwania na określone zdarzenie (np. Nadejście wiadomości).WaitForNextEvent
nie jest wywoływany z poziomu klasy.
Aby podać przykład, który powinien być znajomy, rozważSystem.Diagnostics.Process
. ObnażaExited
zdarzenie, ale także obnaża aWaitForExit
metoda, która umożliwia dzwoniącemu synchroniczne oczekiwanie aż do zakończenia procesu. to jest to, co próbuję osiągnąć tutaj.
Powód, dla którego potrzebujęsignal.Reset()
jest to, jeśli wątek wywołujeWaitForNextEvent
po signal.Set()
został już wywołany (lub innymi słowy, jeśli.Set
został wywołany, gdy żaden wątek nie czekał), zwraca się natychmiast, ponieważ zdarzenie zostało już wcześniej zasygnalizowane.
WaitForNextEvent()
zostanie zasygnalizowanyprzed signal.Reset()
jest nazywany? Jeśli nie, jakie są inne rozwiązania do implementacjiWaitFor
metoda?