// OrtizOL - xCSw - http://o...content-available-to-author-only...t.com using System; using System.Threading; namespace Receta.Multithreading.R0204 { public class EnvioNotificacionesThreads { private static AutoResetEvent eventoSecundario = new AutoResetEvent(false); private static AutoResetEvent eventoPrincipal = new AutoResetEvent(false); public static void Main() { Console.WriteLine(); Thread nuevoThread = new Thread( () => Proceso(3)); nuevoThread.Start(); Console.WriteLine ("Thread `Main`: A espera que el nuevo thread finalice su primera tarea."); // Señal de bloqueo del thread `nuevoThread`: eventoSecundario.WaitOne(); Console.WriteLine("Thread `Main`: La primera de `Proceso` tarea ha finalizado satisfactoriamente."); Console.WriteLine("Thread `Main`: Ejecutando una tarea sobre `Main`."); Thread.Sleep(TimeSpan.FromSeconds(2)); // Señal de desbloqueo del thread `Main`: eventoPrincipal.Set(); Console.WriteLine("Thread `Main`: En ejecución segunda tarea de `Proceso` sobre el nuevo thread."); // Señal de bloqueo del thread `nuevoThread`: eventoSecundario.WaitOne(); Console.WriteLine("Thread `Main`: La segunda operación de `Proceso` ha finalizado."); Console.WriteLine(); } public static void Proceso(int segundosEspera) { Console.WriteLine("Thread `Proceso`: Inicio de proceso largo..."); Thread.Sleep(TimeSpan.FromSeconds(segundosEspera)); Console.WriteLine("Thread `Proceso`: Primera tarea de `Proceo` finalizada."); // Señal de desbloqueo del thread `nuevoThread`: eventoSecundario.Set(); Console.WriteLine("Thread `Proceso`: A espera de que el thread `Main` finalice."); // Señal de bloqueo del thread `Main`: eventoPrincipal.WaitOne(); Console.WriteLine("Thread `Proceso`: Inicio segunda operación del proceso..."); Thread.Sleep(TimeSpan.FromSeconds(segundosEspera)); Console.WriteLine("Thread `Proceso`: ¡Proceo finalizado!"); // Señal de desbloqueo thread `nuevoThread`: eventoSecundario.Set(); } } }