Anexsoft | Blog y dictado de cursos de Tecnología

En este encontrarás tutoriales de tecnología como PHP, ASP.NET MVC, Front-End, entre otros y cursos exigentes de modalidad online que te ayudarán a crecer profesionalmente.

Queremos mejorar la calidad de nuestros cursos. Por favor ayúdanos llenando esta pequeña encuesta
Tutorial sobre programación asíncrona con C# y ejemplos prácticos
Actualizado el 13 Febrero, 2018 y leído 6,171 veces
Calificación: 10.00 / 10

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

Anexsoft

Por defecto las operaciones que realizamos en nuestro sistema son síncronos, lo cual hace que una operación o tarea que se ejecuta pasará por un hilo (thread) determinado y para que otra tarea puede seguir el mismo rumbo deberá esperar a que la anterior haya finalizado.

 

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

Normalmente esto no presenta problema alguno cuando las operaciones son rápidas, pero que suecede cuando por ejemplo: nuestra base de datos anda algo lenta y esta llamada tarda un poco demás, las demás peticiones se van a encolar y van a esperar que la tarea A haya finalizado para que comience la tarea B.

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 convertirlo a un proceso asíncrono, para esto haremos uso de la clase Task para que la lógica del código se vuelva asíncrona.

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

    return result * 100;
}
  • Nuestro método retorna una tarea del tipo entero y le especificamos que es un asíncrona mediante el uso de async.
  • Para convertir nuestra lógica a asíncrona hacemos uso de la clase Task.Run, lo que va dentro será una tarea asíncrona y mediante el await le decimos que queremos esperar a que la tarea finalice.
    • Para hacer uso del await nuestro método donde se esta ejecutando deberá ser async. Estas son las nuevas características que nos presenta netframework y esta disponible en netcore.

Ahora vamos a obtener el resultado de nuestro método asíncrono.

static void Main(string[] args)
{
    Console.WriteLine(
        PercentageChangeAsync(100, 50).Result
    );

    Console.Read();
}
  • En este caso hice uso de la propiedad Result, ya que lo que estamos recibiendo es un tarea del tipo Task<decimal> y su valor se encuentra en la propiedad Result.
  • Sino quisiera usar el .Result y en vez de este usar el await debería volver mi método Main asincróno pero mi proyecto consola no lo reconoce y no sabe que método ejecutar por defecto.

 

Otro ejemplo adicional

Otra buena práctica para los async sería en el caso de métodos void o tareas que no esperamos retorno y queremos que se ejecute en segundo plano. Por ejemplo subimos un excel y este va a demorar algo no queremos que el sistema espere que termine este y que se siga ejecuntado hasta finalizar el flujo. Por ende, dará la sensación que nuestro software es más rápido.

 

Conclusiones

  • En la mayoría de los proyectos que he trabajado suele hacerse mucha programación asíncrona para evitar que las aplicaciones se vuelven lentas.
  • El problema de estas es que suele ser un poco tedioso hacer debug en el caso de encontrar una excepción.
  • La mayoría de los ejemplos de Microsoft y features como EntityFramework soportan métodos asíncronos. Denle una mirada al EntityFramework y verán métodos como ToListAsync, SaveChangesAsync, SingleOrDefaultAsync.
  • Como buena práctica deberemos agregar la palabra Async a nuestros métodos asíncronos.

¡Adquiera ya!

  • Software de Venta e Inventario hecho en PHP y Codeigniter

    Software de Venta e Inventario hecho en PHP y Codeigniter
  • Software de Portafolio Profesional hecho en ASP.NET MVC 5 C#

    Software de Portafolio Profesional hecho en ASP.NET MVC 5 C#
  • Código de fuente de Red Social desarrollada en ASP.NET MVC

    Código de fuente de Red Social desarrollada en ASP.NET MVC

Últimas publicaciones

Encuesta

¿Cómo nos conociste?

Síguenos

Estudia con nosotros y crece profesionalmente

Nuestros cursos han sido hecho en base a lo que demanda el mercado hoy en día.
La experiencia obtenida es la de un ambiente laboral.

Anexsoft
© 2018 Anexsoft, blog y cursos online de TI.