Concurrency in c# – Part 1

Vamos a comenzar con una seria de 4 o 5 partes donde vamos a hablar de concurrencia en c#. Vamos a ver que poderosas herramientas nos da el framework .net para atacar esto y como podemos utilizarla para mejorar el tiempo de respuesta y performance de una app.

Let’s start!
Comencemos con lo básico, que vamos a entender por concurrencia?

Concurrencia: Hacer más de una tarea al mismo tiempo

Ahora que ya sabemos una definición básica, veamos los tipos de concurrencia que nos podemos encontrar:

  • Multithreading: utiliza varios threads de ejecución para realizar tareas en paralelo.
  • Parallel Processing: Divide una carga de trabajo grande en varias threads que se ejecutarán al mismo tiempo.
  • Asynchronous Programming: es una forma de concurrencia que utiliza Promesas o Callbacks para evitar generar threads innecesarios.

Bien, veamos un poco más en detalle Async!

Asynchonous Programming

Principalmente tenemos dos beneficios principales:

  1. Interface de Usuario (GUI) mejora el tiempo de respuesta y no bloquea UI thread.
  2. Escalabilidad: Optimizamos el uso de los recursos del servidor, no generemos threads innecesariamente.

Keywords: async & await

Async se agrega en la firma del método para decirle al compilador que se trata de un método async, que no devolverá una respuesta de inmediato.
Este tipo de method debe retornar un Task<T> si retorna un valor, en el caso que no retorne nada debe devolver: Task NO retornar void.
Task representa futuro, nos dice que algún momento finalizará su ejecución y devolverá ,o no, algo. Una task nos notificará al completar su ejecución, y almacenará su retorno.
Una task también puede ser conocida como Promise.

Volviendo un método async:

Tenemos un metodo sincronico Normal que nos devuelve una lista de categorias.

Bien ahora lo volveremos async, como dijimos para volver un método async tenemos que:
1) Agregar async en la firma del metodo
2) Si usamos async necesitamos un await dentro del método

Agregamos async en la firma del método y un await en el cuerpo

¿Como funciona async?

Un método async comienza su ejecución de forma sincrónica hasta que se encuentra con la keyword await.

En ese momento el compilador chequea si la operación (task) ha finalizado, si esto es así entonces continúa en forma la ejecución sincrónica. En caso contrario, suspende el método y retorna una Task incompleta.  Después cuando la operación se complete, el método asíncrono reanudará su ejecución.

Observemos que la gran ventaja del await es no bloquear el thread de ejecución, ya que en cuanto se encuentra con un await y la tarea no ha finalizado, se suspende el método liberando el thread y dejando disponible para realizar otra tarea.

¿Como sabe dónde volver un método async ?

Cuando se suspende o pause a async method, se guarda el contexto.  El contexto es el actual SynchonizationContext, a menos que null, en ese caso se toma el current TaskScheduler.
Entonces cuando una tarea notifica que termino, el método continua su ejecución dentro de este contexto guardado que podría ser UI context, ASP.NET request context o thread pool context.

Bien, dejemos la teoria por aca, y en la parte 2 vamos a ver unos ejemplos de asyn&await&asynchronous programming

Saludos!
F.M