// OrtizOL - xCSw - http://o...content-available-to-author-only...t.com using System; using System.Threading; namespace Receta.Multithreading.R0506 { public class NotificacionMultiplesThreads { // Instancia de `CountdownEvent` para llevar el control // de conteo de threads que han generado una señal de // registro: public static CountdownEvent contadorFinalizacion = new CountdownEvent(3); public static void Main(string[] args) { Console.WriteLine(Environment.NewLine); Console.WriteLine("Tres threads a punto de iniciar su ejecución..."); Thread t1 = new Thread(() => EjecutarProceso("Proceso #1", 3)); Thread t2 = new Thread(() => EjecutarProceso("Proceso #2", 5)); Thread t3 = new Thread(() => EjecutarProceso("Proceso #2", 8)); // Inicio de la ejecución de los tres threads: t1.Start(); t2.Start(); t3.Start(); // Bloquea a `Main` mientras que el contador (3) llega // a cero (0): contadorFinalizacion.Wait(); Console.WriteLine("\nLas tres operaciones han finalizado."); // BUENA PRÁCTICA: Liberar los recursos ocupados por el // objeto `CountdownEvent`: contadorFinalizacion.Dispose(); Console.WriteLine(Environment.NewLine); } public static void EjecutarProceso(string nombreProceso, int espera) { // Simula la ejecución de una tarea larga: Thread.Sleep(TimeSpan.FromSeconds(espera)); Console.WriteLine("Ejecutándose `{0}`.", nombreProceso); // Registro de señal de finalización: contadorFinalizacion.Signal(); } } }