Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Threading;
- namespace Recetas.Multithreading
- {
- public class TiempoEsperaAsincronico
- {
- public static void Main()
- {
- Console.WriteLine ();
- // Ejecución operaciones asincrónicas SIN tiempo suficiente
- // para completar la ejecución de operaciones de duración extensa:
- EjecutarOperacionesAsincronicas(TimeSpan.FromSeconds(5));
- Console.WriteLine ();
- // Ejecución operaciones asincrónicas CON tiempo suficiente
- // para completar la ejecución de operaciones de duración extensa:
- EjecutarOperacionesAsincronicas(TimeSpan.FromSeconds(7));
- Console.WriteLine ();
- }
- // Inicia la ejecución de operaciones asincrónicas:
- public static void EjecutarOperacionesAsincronicas(TimeSpan tiempoEspera)
- {
- using (var evt = new ManualResetEvent(false))
- using (var cts = new CancellationTokenSource())
- {
- Console.WriteLine ("Registrando operaciones con espera...");
- // Registro de thread:
- var thread = ThreadPool.RegisterWaitForSingleObject( evt,
- (estado, conEspera) => OperacionEsperaCallback(cts, conEspera), null, tiempoEspera, true);
- Console.WriteLine ("Inicio de operación de duración extensa...");
- // Agrega una operación a la cola de ejecución:
- ThreadPool.QueueUserWorkItem( _ => Operacion(cts.Token, evt));
- // Tiempo adicional de espera:
- Thread.Sleep(tiempoEspera.Add(TimeSpan.FromSeconds(2)));
- // Cancela la espera de un thread con registro:
- thread.Unregister(evt);
- }
- }
- // Operación de duración extendida:
- public static void Operacion(CancellationToken token, ManualResetEvent mre)
- {
- for (int i = 1; i <= 6; ++i)
- {
- // Comprueba si se ha solicitado una cancelación de la operación:
- if (token.IsCancellationRequested)
- {
- return;
- }
- // Espera de un segundo por cada ciclo:
- Thread.Sleep(TimeSpan.FromSeconds(1));
- }
- // La operación se ejecutó satisfactoriamente:
- mre.Set();
- }
- // Método callback:
- public static void OperacionEsperaCallback(CancellationTokenSource cts, bool conEspera)
- {
- if (conEspera)
- {
- cts.Cancel();
- Console.WriteLine ("Operación con espera se ha cancelado.");
- }
- else
- {
- Console.WriteLine ("Operación con espera finalizada correctamente.");
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement