wtorek, 12 lutego 2013

[C#|Visual Studio] Threading: Event Wait Handles

Event Wait Handles wykorzystywane są do sygnalizacji pomiędzy wątkami, a więc w sytuacji gdy jeden wątek oczekuje na sygnał od innego. Mamy do dyspozycji kilka typów w C# 4.0

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