domingo, 20 de marzo de 2016

Receta Multithreading en C# No. 3-5: Cómo Usar un Contador de Tiempo en un Pool de Threads

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 Método RegisterWaitForSingleObject
6. Práctica: Tiempo de Espera sobre Operaciones Asincrónicas
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

En esta receta multithreading en C# se demuestra cómo implementar un contador de espera para operaciones de un pool de threads. También se enseña el mecanismo apropiado de espera para un pool de threads. Como se ilustra, esto se logra con el uso de uno de los métodos disponibles en la clase ThreadPool: RegisterWaitForSingleObject.

2. Palabras Clave

  • Contador
  • Callback
  • Operación asincrónica
  • Pool de threads
  • Thread

3. Problema

Implementar un mecanismo de ejecución de threads con contador de tiempo.

4. Solución

La clase ThreadPool cuenta con el método RegisterWaitForSingleObject. Con este método se agrega un callback a la cola de ejecución del pool de threads.

5. Discusión de la Solución

5.1 Método RegisterWaitForSingleObject

El método RegisterWaitForSingleObject ("ThreadPool.RegisterWaitForSingleObject Method", 2016) cuenta con las versiones sobrecargadas listadas en la Tabla 1.
Método sobrecargado RegisterWaitForSingleObject
Tabla 1. Método sobrecargado RegisterWaitForSingleObject ("ThreadPool.RegisterWaitForSingleObject", 2016).
Este método registra un delegado sobre un objeto WaitHandle; además, permite la especificación de un tiempo de espera medido en milisegundos.

En la sección práctica usaremos la versión sobrecargada que acepta un objeto TimeSpan como representación del tiempo de espera.

6. Práctica: Tiempo de Espera sobre Operaciones Asincrónicas

En este ejemplo multithreading se presenta la ejecución de dos operaciones asincrónicas que implementan un contador de límite de tiempo. También incluso el mecanismo de espera apropiado en el pool de threads.

En las líneas 70-81 se declara el método callback OperacionEsperaCallback para responder de acuerdo al modo satisfactorio o insatisfactorio del método Operación (líneas 51-67). Este último método se ejecuta sobre el pool de threads.


En la línea 14 se invoca al método EjecutarOperacionesAsincronicas (líneas 26-48) con un tiempo de espera de 5 segundos. En este caso el tiempo de espera no es suficiente para la finalización satisfactoria del método de tiempo de espera -Operacion-.


Por otro lado, en la línea 20 se invoca el método EjecutarOperacionesAsincronicas, pero esta vez con tiempo de espera de 7 segundos. Esta cantidad de tiempo de espera es suficiente para completar de forma satisfactoria el método Operacion.

Compilación:

csc /t:exe TiempoEsperaAsincronico.cs


Ejecución assembly:


.\TiempoEsperaAsincronico.exe


Demostración ejecución local:
Ejecución assembly TiempoEsperaAsincronico.exe
Animation 1. Ejecución assembly TiempoEsperaAsincronico.exe.

7. Conclusiones

Se demostró el uso del método ThreadPool.RegisterWaitForSingleObject para la ejecución de operaciones asincrónicas en un pool de threads especificando un tiempo de espera para la ejecución de un determinado método sobre un delegado. Esto demuestra el grado de control granular que se posee sobre la ejecución de operaciones asincrónicas.

En la próxima receta multithreading se enseña cómo usar un temporizador para invocación periódica de operaciones asincrónicas sobre un pool de threads.

8. Literatura & Enlaces

Agafonov, E. (2013). Multithreading in C# 5.0 Cookbook. United States: Packt Publishing.
ThreadPool.RegisterWaitForSingleObject Method (System.Threading) (2016, marzo 20). Recuperado desde:
https://msdn.microsoft.com/en-us/library/system.threading.threadpool.registerwaitforsingleobject(v=vs.110).aspx.


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.