AutoResetEvent
Pozwala na powiadomienie jednego oczekującego wątku. Wątek czeka na sygnał. Oczekiwanie rozpoczyna wywołanie metody WaitOne, natomiast wątek notyfikowany jest za pomocą metody Set.
static EventWaitHandle _waitHandle = new AutoResetEvent(false); static void RunAutoResetEvent() { new Thread(Waiter).Start(); Thread.Sleep(1000); _waitHandle.Set(); } static void Waiter() { Console.WriteLine("Waiting..."); _waitHandle.WaitOne(); Console.WriteLine("Notified"); }
Jeżeli metoda Set zostanie wywołana podczas gdy żaden wątek nie oczekuje, dopuszczony do działania zostanie pierwszy wątek, który wywoła metodę WaitOne. Metoda ta przyjmuje opcjonalnie jako parametr wartość timeoutu.
ManualResetEvent
Działa podobnie jak AutoResetEvent, z tą różnicą, że ustawienie Set powoduje, iż przepuszczony zostaje każdy wątek wołający WaitOne, natomiast Reset powoduje, że wątki czekają na powiadomienie.
CountdownEvent
Pozwala zaczekać na więcej niż jeden wątek, liczbę wątków, które muszą powiadomić określa się w konstruktorze. Wątki wysyłają sygnały poprzez metodę Signal.
static CountdownEvent _countdown = new CountdownEvent(3); static void RunCountDownEvent() { new Thread(SaySomething).Start("I am thread 1"); new Thread(SaySomething).Start("I am thread 2"); new Thread(SaySomething).Start("I am thread 3"); _countdown.Wait(); Console.WriteLine("All threads have finished speaking!"); } static void SaySomething(object thing) { Thread.Sleep(1000); Console.WriteLine(thing); _countdown.Signal(); }
Wywołanie metody Reset spowoduje przywrócenie licznikowi wyjściowej postaci.
Brak komentarzy:
Prześlij komentarz