2013-08-09 9 views
12

Wie kann ich auf n Anzahl der Impulse warten?Lassen Sie einen Thread auf n Impulse warten

… // do something 
waiter.WaitForNotifications(); 

Ich möchte der obige Thread warten, bis n mal (n durch unterschiedliche Fäden oder n-mal durch den gleichen Thread) informiert wird.

Ich glaube, es gibt eine Art von Zähler, um dies zu tun, aber ich kann es nicht finden.

Antwort

22

Werfen Sie einen Blick auf die CountdownEvent Class:

CountdownEvent Klasse

Stellt eine primitive Synchronisation dass signalisiert wird, wenn seine Zählung Null erreicht.

Beispiel:

CountdownEvent waiter = new CountdownEvent(n); 

// notifying thread 
waiter.Signal(); 

// waiting thread 
waiter.Wait(); 
+0

Thx, das war genau das, was ich suchte – Toto

8

Durch ein einfaches ManualResetEvent mit und Interlocked.Decrement

class SimpleCountdown 
{ 
    private readonly ManualResetEvent mre = new ManualResetEvent(false); 

    private int remainingPulses; 

    public int RemainingPulses 
    { 
     get 
     { 
      // Note that this value could be not "correct" 
      // You would need to do a 
      // Thread.VolatileRead(ref this.remainingPulses); 
      return this.remainingPulses; 
     } 
    } 

    public SimpleCountdown(int pulses) 
    { 
     this.remainingPulses = pulses; 
    } 

    public void Wait() 
    { 
     this.mre.WaitOne(); 
    } 

    public bool Pulse() 
    { 
     if (Interlocked.Decrement(ref this.remainingPulses) == 0) 
     { 
      mre.Set(); 
      return true; 
     } 

     return false; 
    } 
} 

public static SimpleCountdown sc = new SimpleCountdown(10); 

public static void Waiter() 
{ 
    sc.Wait(); 
    Console.WriteLine("Finished waiting"); 
} 

public static void Main() 
{ 
    new Thread(Waiter).Start(); 

    while (true) 
    { 
     // Press 10 keys 
     Console.ReadKey(); 

     sc.Pulse(); 
    } 
} 

Beachten Sie, dass am Ende, das Ihr Problem oft auf dieses andere Problem verbunden: Workaround for the WaitHandle.WaitAll 64 handle limit?

Meine Lösung ist gut, wenn Sie nicht .NET> = 4 haben (weil die andere Lösung, CountdownEvent, in .NET 4 eingeführt wurde)

Verwandte Themen