Skip to content

Instantly share code, notes, and snippets.

@Fhernd
Last active February 21, 2021 16:01
Show Gist options
  • Save Fhernd/af306d97cb3b6132e217 to your computer and use it in GitHub Desktop.
Save Fhernd/af306d97cb3b6132e217 to your computer and use it in GitHub Desktop.
Uso del delegado WaitOrTimerCallback en C#.
using System;
using System.Threading;
namespace Recetas.Cap04
{
// Clase que contiene información útil para el
// método invocado por el delegado WaitOrTimerCallback:
public class InformacionTarea
{
public RegisteredWaitHandle Handle = null;
public string Mensaje = "valor";
}
public class UsoWaitOrTimerCallback
{
public static void Main()
{
// El tread Main usa instancia de AutoResetEvent para señalizar
// el manejador de espera registrado. Este se encarga
// de invocar al método callback:
AutoResetEvent are = new AutoResetEvent (false);
InformacionTarea it = new InformacionTarea();
it.Mensaje = "Primera tarea";
// El campo Handle de InformacionTarea contiene de la instancia
// RegistredWaitHandle generada por el método
// RegisterWaitForSingleObject:
it.Handle = ThreadPool.RegisterWaitForSingleObject (
are,
new WaitOrTimerCallback (ProcesoEspera),
it,
1000,
false
);
// Se realiza una espera de hasta 3 segundos en el thread main
// para demostrar la superación del tiempo de espera; luego
// la generación de la señal:
Thread.Sleep (3000);
Console.WriteLine ("El thread main genera la señal.");
are.Set ();
// El thread main se suspende, para dar un tiemp de espera adicional
// y que el programa no finalice sin completar todas las tareas:
Thread.Sleep (1000);
}
// Método callback para el delegado WaitOrTimerCallback. Este
// método se ejecuta cuando se agota el tiempo de espera o
// la instancia de tipo WaitHandle (AutoResetEvent) ha generado
// una señal:
public static void ProcesoEspera (object estado, bool tiempoAgotado)
{
// Conversión explícita al objeto InformacionTarea:
InformacionTarea it = (InformacionTarea) estado;
string causa = "TIEMPO AGOTADO";
if ( !tiempoAgotado )
{
causa = "SEÑALADO";
// Cuando la instancia WaitHandle es señalizada, se
// detiene cualquier ejecución futura del método
// callback:
if (it.Handle != null)
{
it.Handle.Unregister (null);
}
}
// Resumen:
Console.WriteLine ("El método ProcesoEspera se ejecutó en el thread {0}. Causa = {1}",
Thread.CurrentThread.GetHashCode().ToString(), causa);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment