Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. // OrtizOL - xCSw - http://ortizol.blogspot.com
  2.  
  3. using System;
  4. using System.Threading;
  5.  
  6. namespace Receta.Multithreading.R0506
  7. {
  8.     public class NotificacionMultiplesThreads
  9.     {
  10.         // Instancia de `CountdownEvent` para llevar el control
  11.         // de conteo de threads que han generado una señal de
  12.         // registro:
  13.         public static CountdownEvent contadorFinalizacion =
  14.                       new CountdownEvent(3);
  15.        
  16.        
  17.         public static void Main(string[] args)
  18.         {
  19.             Console.WriteLine(Environment.NewLine);
  20.            
  21.             Console.WriteLine("Tres threads a punto de iniciar su ejecución...");
  22.            
  23.             Thread t1 = new Thread(() => EjecutarProceso("Proceso #1", 3));
  24.             Thread t2 = new Thread(() => EjecutarProceso("Proceso #2", 5));
  25.             Thread t3 = new Thread(() => EjecutarProceso("Proceso #2", 8));
  26.            
  27.             // Inicio de la ejecución de los tres threads:
  28.             t1.Start();
  29.             t2.Start();
  30.             t3.Start();
  31.            
  32.             // Bloquea a `Main` mientras que el contador (3) llega
  33.             // a cero (0):
  34.             contadorFinalizacion.Wait();
  35.            
  36.             Console.WriteLine("\nLas tres operaciones han finalizado.");
  37.            
  38.             // BUENA PRÁCTICA: Liberar los recursos ocupados por el
  39.             // objeto `CountdownEvent`:
  40.             contadorFinalizacion.Dispose();
  41.            
  42.             Console.WriteLine(Environment.NewLine);
  43.         }
  44.        
  45.         public static void EjecutarProceso(string nombreProceso, int espera)
  46.         {
  47.             // Simula la ejecución de una tarea larga:
  48.             Thread.Sleep(TimeSpan.FromSeconds(espera));
  49.             Console.WriteLine("Ejecutándose `{0}`.", nombreProceso);
  50.            
  51.             // Registro de señal de finalización:
  52.             contadorFinalizacion.Signal();
  53.         }
  54.     }
  55. }