// 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();
}
}
}