fork download
  1. // OrtizOL - xCSw - http://o...content-available-to-author-only...t.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. }
  56.  
Success #stdin #stdout 0.03s 30296KB
stdin
Standard input is empty
stdout

Tres threads a punto de iniciar su ejecución...
Ejecutándose `Proceso #1`.
Ejecutándose `Proceso #2`.
Ejecutándose `Proceso #2`.

Las tres operaciones han finalizado.