Last active
February 21, 2021 16:01
-
-
Save Fhernd/af306d97cb3b6132e217 to your computer and use it in GitHub Desktop.
Uso del delegado WaitOrTimerCallback en C#.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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