Advertisement
Fhernd

TiempoEsperaAsincronico.cs

Mar 20th, 2016
1,404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.05 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Recetas.Multithreading
  5. {
  6.     public class TiempoEsperaAsincronico
  7.     {
  8.         public static void Main()
  9.         {
  10.             Console.WriteLine ();
  11.            
  12.             // Ejecución operaciones asincrónicas SIN tiempo suficiente
  13.             // para completar la ejecución de operaciones de duración extensa:
  14.             EjecutarOperacionesAsincronicas(TimeSpan.FromSeconds(5));
  15.            
  16.             Console.WriteLine ();
  17.            
  18.             // Ejecución operaciones asincrónicas CON tiempo suficiente
  19.             // para completar la ejecución de operaciones de duración extensa:
  20.             EjecutarOperacionesAsincronicas(TimeSpan.FromSeconds(7));
  21.            
  22.             Console.WriteLine ();
  23.         }
  24.  
  25.         // Inicia la ejecución de operaciones asincrónicas:
  26.         public static void EjecutarOperacionesAsincronicas(TimeSpan tiempoEspera)
  27.         {
  28.             using (var evt = new ManualResetEvent(false))
  29.             using (var cts = new CancellationTokenSource())
  30.             {
  31.                 Console.WriteLine ("Registrando operaciones con espera...");
  32.                
  33.                 // Registro de thread:
  34.                 var thread = ThreadPool.RegisterWaitForSingleObject( evt,
  35.                     (estado, conEspera) => OperacionEsperaCallback(cts, conEspera), null, tiempoEspera, true);
  36.                    
  37.                 Console.WriteLine ("Inicio de operación de duración extensa...");
  38.                
  39.                 // Agrega una operación a la cola de ejecución:
  40.                 ThreadPool.QueueUserWorkItem( _ => Operacion(cts.Token, evt));
  41.                
  42.                 // Tiempo adicional de espera:
  43.                 Thread.Sleep(tiempoEspera.Add(TimeSpan.FromSeconds(2)));
  44.                
  45.                 // Cancela la espera de un thread con registro:
  46.                 thread.Unregister(evt);
  47.             }
  48.         }
  49.        
  50.         // Operación de duración extendida:
  51.         public static void Operacion(CancellationToken token, ManualResetEvent mre)
  52.         {
  53.             for (int i = 1; i <= 6; ++i)
  54.             {
  55.                 // Comprueba si se ha solicitado una cancelación de la operación:
  56.                 if (token.IsCancellationRequested)
  57.                 {
  58.                     return;
  59.                 }
  60.                
  61.                 // Espera de un segundo por cada ciclo:
  62.                 Thread.Sleep(TimeSpan.FromSeconds(1));
  63.             }
  64.            
  65.             // La operación se ejecutó satisfactoriamente:
  66.             mre.Set();
  67.         }
  68.        
  69.         // Método callback:
  70.         public static void OperacionEsperaCallback(CancellationTokenSource cts, bool conEspera)
  71.         {
  72.             if (conEspera)
  73.             {
  74.                 cts.Cancel();
  75.                 Console.WriteLine ("Operación con espera se ha cancelado.");
  76.             }
  77.             else
  78.             {
  79.                 Console.WriteLine ("Operación con espera finalizada correctamente.");
  80.             }
  81.         }
  82.     }
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement