2010-04-23 7 views
11

Je connais C#, mais j'ai du mal à comprendre certains concepts de base (je pense) comme la signalisation.Notions de base de la signalisation des fils

J'ai passé du temps à chercher des exemples, même ici, sans chance. Peut-être que quelques exemples ou un scénario simple seraient bien utiles pour le comprendre.

Répondre

20

Voici un exemple d'application de console sur mesure pour vous. Pas vraiment un bon scénario du monde réel, mais l'utilisation de la signalisation de fil est là.

using System; 
using System.Threading; 

class Program 
{ 
    static void Main() 
    { 
     bool isCompleted = false; 
     int diceRollResult = 0; 

     // AutoResetEvent is one type of the WaitHandle that you can use for signaling purpose. 
     AutoResetEvent waitHandle = new AutoResetEvent(false); 

     Thread thread = new Thread(delegate() { 
      Random random = new Random(); 
      int numberOfTimesToLoop = random.Next(1, 10); 

      for (int i = 0; i < numberOfTimesToLoop - 1; i++) { 
       diceRollResult = random.Next(1, 6); 

       // Signal the waiting thread so that it knows the result is ready. 
       waitHandle.Set(); 

       // Sleep so that the waiting thread have enough time to get the result properly - no race condition. 
       Thread.Sleep(1000); 
      } 

      diceRollResult = random.Next(1, 6); 
      isCompleted = true; 

      // Signal the waiting thread so that it knows the result is ready. 
      waitHandle.Set(); 
     }); 

     thread.Start(); 

     while (!isCompleted) { 
      // Wait for signal from the dice rolling thread. 
      waitHandle.WaitOne(); 
      Console.WriteLine("Dice roll result: {0}", diceRollResult); 
     } 

     Console.Write("Dice roll completed. Press any key to quit..."); 
     Console.ReadKey(true); 
    } 
} 
+0

Merci et désolé pour la réponse tardive Amry (carte vidéo est mort hier, acheté un nouveau aujourd'hui). Je vais le courir tout de suite. – Marcote

3

C'est une très grande zone pour moi de vous donner des indications précises.

Pour comprendre des concepts tels que la signalisation, ce lien sur Thread Synchronization serait un bon point de départ. Il y a aussi des exemples. Vous pouvez ensuite explorer des types spécifiques de .net en fonction de ce que vous essayez de faire. Signal entre threads dans un processus ou entre processus etc.

4

Comment cela fonctionne en un mot.

  1. AutoResetEvent waitHandle = new AutoResetEvent(false); --- Le faux signifie que cette poignée d'attente est si un waitHandle.WaitOne non signalé() est appelée, elle arrête le fil.

  2. Le fil que vous voulez attendre un autre événement pour compléter ajouter waitHandle.WaitOne();

  3. Dans le thread qui doit être achevé à la fin une fois rempli ajoutez waitHandle.Set();

waitHandle.WaitOne(); Waits pour le signal

waitHandle.Set(); signale l'achèvement.

Questions connexes