martes, 21 de julio de 2015

Receta Multithreading en C# No. 3-2: Exponer una Operación Asincrónica en un Pool de Threads

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
3.1 Método static QueueUserWorkItem
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

En esta segunda receta multithreading en C# aprenderemos a exponer (post) una operación asincrónica en un pool de threads. Para llevar lo anterior a cabo, tendremos que recurrir al uso de la clase ThreadPool. Usaremos varias versiones de la operación asincrónica: método, expresión lambda, y un closure.

1. Problema

Exponer (post) una operación asincrónica en un pool de threads.

2. Solución

Con el método QueueUserWorkItem es posible poner una operación asincrónica en un pool de threads. Este método pertenece a la clase ThreadPool.

3. Discusión de la Solución

3.1 Método static QueueUserWorkItem

El método sobrecaragado QueueUserWorkItem [3] definido en la clase ThreadPool [2] (System.Threading) permite la exposición (post) de una operación asincrónica en una cola de espera hasta que haya un thread disponible en el pool de threads para iniciar su ejecución.

Estas son las versiones sobrecargadas de este método:
Versiones sobrecargadas del método QueueUserWorkItem
Figura 1. Versiones sobrecargadas del método QueueUserWorkItem [3].
Escribamos un ejemplo de uso sencillo de la primera versión de este método:

En la línea 16:

ThreadPool.QueueUserWorkItem(new WaitCallback(MetodoAsincronico));


invocamos al método QueueUserWorkItem al que pasamos como argumento un objeto del tipo de delegado WaitCallback [4]; objeto que asocia el método MetodoAsincronico para ejecución asincrónica en un pool de threads.


Con Thread.Sleep(2000) (línea 19) simulamos una tarea larga en Main; mientras tanto de forma asincrónica se ejecuta el método MetodoAsincronico.

Compilación: 


  1. csc /target:exe UsoQueueUserWorkItem.cs


Ejecución assembly


  1. .\UsoQueueUserWorkItem.exe

> Prueba de ejecución: 
Ejecución assembly UsoQueueUserWorkItem.exe
Animación 1. Ejecución assembly UsoQueueUserWorkItem.exe.

4. Práctica: Código C#

Creamos un ejemplo donde se incluyan diferentes versiones o modos de exponer (post) una operación asincrónica en un pool de threads.

En la línea 20 exponemos (post) el método OperacionAsincronica al pool de threads para ser ejecutado de forma asincrónica por uno de los threads disponibles.


En la línea 26 invocamos al método QueueUserWorkItem pasando como primer argumento el método OperacionAsincronica y el objeto de estado.


Más adelante, línea 32, creamos una expresión lambda con un conjunto expresiones similares al método OperacionAsincronica. (Con esto demostramos que también es posible escribir una expresión lambda asignable a la cola de espera en un pool de threads.)


Sobre la línea 40 usamos las variables estado, x, e y en el closure. La ventaja de usar este último enfoque: 
"...It gives us more flexibility, and allows us to provide more than one object to the asynchronous operation and static typing for those objects."
Compilación: 


  1. csc /target:exe OperacionAsincronicaEnPoolThreads.cs

Ejecución assembly


  1. .\OperacionAsincronicaEnPoolThreads.exe

> Prueba de ejecución: http://ideone.com/FXbs71

> Prueba de ejecución: 
Ejecución assembly OperacionAsincronicaEnPoolThreads.exe
Animación 2. Ejecución assembly OperacionAsincronicaEnPoolThreads.exe.

5. Conclusiones

Hemos visto qué tan fácil resulta exponer (post) una operación asincrónica en un pool de threads utilizando el método sobrecargado ThreadPool.QueueUserWorkItem. Vimos tres formas de exponer una operación asincrónica: pasando un método con firma compatatible con el delegado WaitCallback, definiendo una expresión lambda, y un closure.


En la próxima receta multithreading en C# estudiáremos el grado de paralelismo de un pool de threads.

6. Glosario

  • Asincronía
  • Método asincrónico
  • Operación asincrónica
  • Pool de threads
  • Thread

7. Literatura & Enlaces

[1]: .Multithreading in C# 5.0 Cookbook by Eugene Agafonov. Copyright 2013 Eugene Agafonov, 978-1-84969-764-4.
[2]: ThreadPool Class (System.Threading) - https://msdn.microsoft.com/en-us/library/system.threading.threadpool(v=vs.110).aspx
[3]: ThreadPool.QueueUserWorkItem Method (System.Threading) - https://msdn.microsoft.com/en-us/library/system.threading.threadpool.queueuserworkitem(v=vs.110).aspx
[4]: WaitCallback Delegate (System.Threading) - https://msdn.microsoft.com/en-us/library/system.threading.waitcallback(v=vs.110).aspx


V

No hay comentarios:

Publicar un comentario

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