Para el desarrollo de aplicaciones con MVC, no se dispone de un número ilimitado de hilos (Threads en inglés) destinados al procesamiento de peticiones. Cada vez que una petición se realiza, uno de estos hilos se destina exclusivamente a atender dicha petición, y permanecerá ocupado hasta que dicha petición acabe. En caso de que se produzca una petición cuando todos los hilos estén ocupados, esta se introducirá en una cola, también limitada. Si dicha cola se llena, el servidor responderá con un error HTTP 503.

En el desarrollo normal, las peticiones se producen una a una, y mientras una petición no se ha procesado y ha finalizado con éxito, la ejecución de código continúa. En caso de que una petición sea más lenta (ya sea una petición lenta a una Base de Datos, o bien un bucle que necesite de muchas iteraciones) el hilo quedará bloqueado hasta que termine.

La ventaja de las operaciones asíncronas reside en liberar el hilo mientras se espera a que una tarea se concluya. Una vez finalice dicha tarea, el servidor le asignará otro hilo para que continúe con la ejecución.

En operaciones sencillas esto no se aprecia, ya que nunca llegan a estar ocupados todos los hilos disponibles, pero en aplicaciones que dan servicio a muchos usuarios de manera concurrente, la diferencia es notable.

A partir de MVC 4, la mecánica para introducir operaciones asíncronas en un proyecto es muy sencilla:

  • La acción debe devolver un Task<T>. Normalmente T será ActionResult, aunque también puede ser cualquier tipo primitivo, ya sea Int, o String como en el caso del ejemplo.
  • En la declaración del método debemos introducir la palabra clave De esta forma, se invocará un proceso asíncrono cuyo resultado obtendremos con await.
  • Para seguir la notación estándar, los métodos deberán llevar el sufijo En nuestro caso, deberían ser AccionesConcatenadasAsync(), y AccionesSimultaneasAsync().
  • Por último, llamar a dichos métodos asíncronos usando la palabra clave

La librería Tasks facilita distintas funcionalidades para el manejo de las operaciones asíncronas. Entre las más sencillas y útiles, tenemos  Task.WhenAll(), que espera a que acaben todas las tareas para proseguir con la ejecución, Task.WhenAny() , que continua con la ejecución cuando acaba cualquiera de las tareas, etc

La implementación de acciones asíncronas para la ejecución de tareas complejas, con muchas iteraciones, o en general de cierta duración aporta grandes beneficios a la hora de optimizar el rendimiento en los sistemas de alta concurrencia, y su desarrollo en ASP.NET MVC 4 y superior resulta muy sencillo.

Su uso está recomendado sobre todo para tareas que impliquen el acceso a recursos externos. Si el proceso a realizar es pesado, y consumiremos muchos recursos de nuestra propia CPU, los beneficios que se obtendrán con la implementación de operaciones asíncronas no tendrán tanto impacto en el rendimiento de nuestro proceso.

Para consultar el código empleado en el videotutorial, el enlace a repositorio de GitHub es: https://github.com/JCQuiroga/OpAsincronas.git

Autor: Jose Carlos Quiroga Garre

Curso: Microsoft MCSD Web Applications + SharePoint Apps

Año Lectivo: 2015-2016

Centro de Formación: Centro de formación TIC Tajamar