2010-04-23 14 views
11

Conozco C#, pero tengo problemas para entender algunos conceptos básicos (creo) como la señalización.Fundamentos de señalización de subprocesos

Pasé algún tiempo buscando algunos ejemplos, incluso aquí, sin suerte. Quizás algunos ejemplos o un escenario realmente simple sean geniales para entenderlo.

Respuesta

20

Aquí hay un ejemplo de aplicación de consola personalizada para usted. No es realmente un buen escenario en el mundo real, pero el uso de la señalización de hilos está ahí.

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

Gracias y lo siento por la respuesta tardía Amry (la tarjeta de video murió ayer, compró una nueva hoy). Lo ejecutaré de inmediato. – Marcote

3

Es un área bastante grande para que pueda darle indicaciones precisas.

Para comprender conceptos como la señalización, este enlace en Thread Synchronization sería un buen lugar para comenzar. También tiene ejemplos. A continuación, puede profundizar en tipos .NET específicos en función de lo que está intentando hacer ... señal entre hilos dentro de un proceso o entre procesos, etc.

4

La forma en que esto funciona en pocas palabras.

  1. AutoResetEvent waitHandle = new AutoResetEvent(false); --- El falso significa que ese mango espera es unsignaled si un waitHandle.WaitOne() se llama se detendrá el hilo.

  2. El hilo desea esperar a que otro evento para completar añadir waitHandle.WaitOne();

  3. En el hilo que debe ser completado, al final, cuando completado añadir waitHandle.Set();

waitHandle.WaitOne(); Waits para la señal

waitHandle.Set(); señales de finalización.

Cuestiones relacionadas