Capítulo 7 – Threading (Manejo de Hilos)–Parte 2

 
Lección 3 – Modelo de programación asíncrono.

Entendiendo la programación asíncrona
Permite que distintas partes de código sean ejecutadas en hilos separados.
En .Net Framework existen muchos métodos de la forma BeginXXX y EndXXX que trabajan de forma asíncrona para poder crear otro hilo que trabaje, mientras nosotros realizamos otras cosas en el programa.


Modelo Rendezvous


Hay 3 estilos de programación asíncrona

· Wait-Until-Done: este modelo permite empezar una llamada asíncrona y realizar otro trabajo. una vez que se realizó lo que se deseaba, se debe colocar una llamada para bloquearse mientras se espera que la llamada asíncrona esté completa.
Ejemplo:
image
Es del estilo de BeginRead y EndRead.

· Polling: muy parecido al anterior, solo que la forma de revisar si se ha completado la llamada asíncrona, es mediante el objeto IAsyncResult, se debe consultar a su propiedad IsCompleted, para ver si se terminó o no.
image

· Callback : El modelo callback necesita que especifiquemos un método a llamar e incluir cualquier estado que nosotros necesitemos en el metodo callback para completar la llamada
image
El parámetro stream, cuando se realiza la llamada asíncrona, es porque puede ser necesario pasar el filestream como estado.
image

 
Excepciones y APM (modelo de programación asíncrona)
Cuando se usa APM, pueden surgir muchas excepciones. Si ocurre una excepción dentro de la llamada asíncrona, ésta es mostrada cuando se llama a EndXXX (se debe realizar try/catch)
image

 
Usando ThreadPool
En muchos casos, crear threads propios no es necesario o sugerido, .Net te soporta un pool de hilos que pueden ser usados en muchas situaciones donde se necesitan crear hilos propios:
image
image
.Net mantiene un conjunto de threads que pueden ser reusados para la aplicación.es más rápido porque se reúsa solo lo necesario.

La clase ThreadPool soporta métodos no solo para encolar trabajos (queuing up work items), sino además para administrar el ThreadPool.
Métodos más importantes y usados son:
GetAvailableThreads número de hilos disponibles para uso en el pool
GetMaxThreads Número máximo de hilos que puede soportar este ThreadPool.
GetMinThreads Mínimo de hilos que son creados en cualquier momento.
QueueUserWorkItem Agrega un trabajo al thread pool para ser ejecutado en un hilo disponible.
Si quieren consultar un poco más sobre esta clase y ver otros métodos usados, se puede hacer clic aquí.
 
Limitando el número de threads en un ThreadPool
La clase ThreadPool soporta algunos métodos estáticos para limitar el mínimo y máximo de threads que se pueden usar.
Existen 2 situaciones donde se debe de cambiar el límite de hilos del ThreadPool: thread starvation,(supongo que la traducción seria, Inanición de hilos o falta de hilos) y aumentar velocidad de hilos.

Thread-starvation: cuando la aplicación necesita muchos hilos y sobrepasa la cantidad de threads que la ThreadPool contiene. Se usa ThreadPool.SetMaxThreads
image
Un completion port (puerto de finalización), es un hilo de nivel de kernel que es utilizado para hacer operaciones I/O a archivos. Normalmente hay más puerto de finalización que números de hilos administrados.

Elevar el número mínimo de hilos, puede incrementar la performance y permite que la aplicación cree threads mas rápido.
Se realiza de la misma forma que la anterior:
image
 
ThreadPool y WaitHandle (manejador de espera)
El threadPool también provee mecanismos para que los threads esperen manejadores (handles) y llamen métodos cuando reciban una señal:
image
Método llamado:
image
 
La clase SynchronizationContext

Existen diferentes modelos de hilos en Windows Forms que en ASP .NET.
Para tratar con estos modelos diferentes se debe trabajar con la clase SynchronizationContext, esta permite escribir código sin importar el modelo de hilos de la aplicación.
Para usar la clase SynchronizationContext, se debe crear una instancia, llamando a SynchronizationContext.Current
Después de esto se pueden realizar varias cosas:

1. Llamar al método Send, que ejecute un código y este se va a bloquear hasta que el código ejecutado retorne.
image

2. Ejecutar el método Post, llama a un código, encola el pedido y retorna inmediatamente si es posible.
image

Usando objetos Timer

Un timer es un objeto básico que se dispara una llamada asincrónica a un método basado en el tiempo.
Cuando se crea el Timer, se especifica un delegado TimerCallback que apunta a un método que se desea ejecutar cuando el Timer lo levante. Se debe especificar cuándo se quiere empezar, así como el tiempo entre firings (disparos). Por ejemplo:
image
image
Eso va a crear un timer que se ejecute al momento (o) y llame al Callback (con el método TimerTick que imprime Tick) cada segundo.

La clase timer también soporta el método Change que permite volver a especificar cuándo comienza y los intervalos de tiempo.
image
Infinite, significa que a partir de ahora, se detiene el timer cada un segundo


....................................................................................................................................................
Bajar esta capítulo en formato PDF                                                                Codigo Ejemplo
....................................................................................................................................................

1 comentario:

  1. Le entendiste bien para k es esta clase SynchronizationContext a mi me quedan muchas dudas y hay muy poca informacion

    ResponderEliminar