Notions de base sur la signalisation de fil

Je connais le C #, mais j’ai du mal à comprendre certains concepts de base (je pense) tels que la signalisation.

J’ai passé du temps à chercher des exemples, même ici, sans succès. Il serait peut-être bon de comprendre quelques exemples ou un scénario très simple.

Voici un exemple d’application de console sur mesure pour vous. Ce n’est pas vraiment un bon scénario 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); } } 

La façon dont cela fonctionne en quelques mots.

  1. AutoResetEvent waitHandle = new AutoResetEvent(false); — La valeur false signifie que ce descripteur d’attente n’est pas signalé si un waitHandle.WaitOne () est appelé, il arrêtera le thread.

  2. Le thread que vous voulez attendre qu’un autre événement soit terminé add waitHandle.WaitOne();

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

waitHandle.WaitOne(); Attend le signal

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

C’est un domaine assez vaste pour moi qui vous donne des indications précises.

Pour comprendre des concepts tels que la signalisation, ce lien sur la synchronisation des threads serait un bon sharepoint départ. Il a aussi des exemples. Vous pouvez ensuite explorer des types .net spécifiques en fonction de ce que vous essayez de faire. Signalez entre les threads au sein d’un processus ou entre processus, etc.