Tutorial sobre programación asíncrona con C# y ejemplos prácticos

Evita el retraso dentro de tus aplicaciones creando múltiples hilos de ejecución.

Rodríguez Patiño, Eduardo
2020-09-28 | 24,113 lecturas
Actualizado:

Las operaciones que realizamos a través de nuestras aplicaciones por defecto son síncronas, es decir que no se puede ejecutar otra tarea hasta que haya finalizado la anterior.

¿Cuál es el problema o desventaja con esto?

En realidad no es un problema cuando las operaciones son rápidas, pero puede darse el caso que ciertas operaciones como la lectura de un reporte pueda hacer que tarde más de lo usual y por lo tanto creará una mala experiencia a nuestro usuario porque pensará que su app se ha colgado o ha sido bloqueada.

Como dando otro ejemplo podemos asumir porque los sistemas de las universidades cuando un alumno se va a matricular y arma su horario de estudio se ponen demasiado lentos ya que, la mayoría de estos sistemas pasan por el mismo hilo y a eso le aumentamos la demanda actual del tráfico hace que los sistemas se sientan demasiado lentos generando una molestia en el alumno.

¿Qué hace la programación asíncrona?

Evita que nuestras tareas a realizar pasen por el mismo hilo ejecutando un nuevo hilo cuando esta es llamada de esta manera no se quedará en espera a que la tarea anterior termine, sino, comenzará la tarea usando un nuevo hilo.

Ejemplo práctico - async/await

Primero vamos a mostrar un código síncrono que nos permite calcular la variación porcentual de 2 montos.

static decimal PercentageChange(decimal mount1, decimal mount2)
{
    return (mount2 - mount1) / mount1 * 100;
}

Ahora vamos a volverlo en un método asíncrono para evitar el bloqueo de hilos.

static async Task<decimal> PercentageChangeAsync(decimal mount1, decimal mount2)
{
    var result = await Task.Run(() => {
        return (mount2 - mount1) / mount1;
    });

    return result * 100;
}
  • Para especificar que nuestro método pueda ejecutar código asíncrono le hemos especificado la palabra async.
  • Ya tenemos un método que pueda ejecutar código asíncrono facilmente pero todavía no su lógica no es asíncrona. Por lo tanto, lo que hemos hecho es hacer uso de la clase Task para ejecutar código asíncrono.
  • Finalmente nuestro método asíncrono retorna una tarea y esta tarea la vamos a decinir que debe ser de un cierto tipo (decimal en nuestro caso).

Para obtener el resultado de este haremos uso de la palabra await.

var result = await PercentageChangeAsync(100, 50);

Nota: para hacer uso del await el método principal deberá hacer uso de async.