Advertisement
Fhernd

NotificacionMultiplesThreads.cs

Jul 9th, 2015
1,131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.87 KB | None | 0 0
  1. // OrtizOL - xCSw - http://ortizol.blogspot.com
  2.  
  3. using System;
  4. using System.Threading;
  5.  
  6. namespace Receta.Multithreading.R0505
  7. {
  8.     public class NotificacionMultiplesThreads
  9.     {
  10.         // Instancia de `ManualResetEventSlim` para el control de la
  11.         // ejecución de múltiples threads:
  12.         public static ManualResetEventSlim evento = new ManualResetEventSlim(false);
  13.        
  14.         public static void Main(string[] args)
  15.         {
  16.             Console.WriteLine(Environment.NewLine);
  17.            
  18.             // Creación de 3 threads:
  19.             Thread t1 = new Thread(() => Proceso("Thread1", 5));
  20.             Thread t2 = new Thread(() => Proceso("Thread2", 6));
  21.             Thread t3 = new Thread(() => Proceso("Thread3", 12));
  22.            
  23.             // Inicio de la ejecución de los threads:
  24.             t1.Start();
  25.             t2.Start();
  26.             t3.Start();
  27.            
  28.             Thread.Sleep(TimeSpan.FromSeconds(6));
  29.            
  30.             // Tiempo de espera en `Main`:
  31.             Console.WriteLine("\nDesde el thread `Main` se da continución a los threads: `evento.Set()`.\n");
  32.             evento.Set();
  33.            
  34.             Thread.Sleep(TimeSpan.FromSeconds(2));
  35.            
  36.             evento.Reset();
  37.             Console.WriteLine("\nSe envía una notificación de suspensión de la ejecución de los 3 threads: `evento.Reset()`.\n");
  38.            
  39.             Thread.Sleep(TimeSpan.FromSeconds(10));
  40.            
  41.             Console.WriteLine("\nUna nueva señal de continuación de la ejecución de los 3 threads: `evento.Set()`.\n");
  42.             evento.Set();
  43.            
  44.             Thread.Sleep(TimeSpan.FromSeconds(2));
  45.            
  46.             Console.WriteLine("\nSeñal final de suspensión: `evento.Reset()`.");
  47.             evento.Reset();
  48.            
  49.             // BUENA PRÁCTICA: Invocar `evento.Dispose()` una vez se haya
  50.             // terminado con el uso del objeto `ManualResetEventSlim`:
  51.             evento.Dispose();
  52.            
  53.             Console.WriteLine(Environment.NewLine);
  54.         }
  55.        
  56.         public static void Proceso(String nombreThread, int tiempoEspera)
  57.         {
  58.             Console.WriteLine("El thread `{0}` ha iniciado su ejecución.", nombreThread);
  59.             Console.WriteLine("El thread `{0}` está a punto de suspenderse por {1} segundos.",
  60.                               nombreThread, tiempoEspera);
  61.             Thread.Sleep(TimeSpan.FromSeconds(tiempoEspera));
  62.             Console.WriteLine("El thread `{0}` se halla en espera de notificación para continuar su ejecución.",
  63.                               nombreThread);
  64.             evento.Wait();
  65.             Console.WriteLine("El thread `{0}` ha sido notificado y continua su ejecución.", nombreThread);
  66.             Console.WriteLine("El thread `{0}` ha finalizado su ejecución.", nombreThread);
  67.         }
  68.     }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement