Saltar al contenido principal

Async / Await

Conceptos Fundamentales de la Programación Asíncrona

La programación asíncrona permite que una aplicación realice múltiples tareas al mismo tiempo sin bloquear el hilo principal.
En C#, la palabra clave async se utiliza para marcar un método como asíncrono, mientras que await se emplea para esperar la finalización de una tarea.

Beneficios: - Mejora el rendimiento y la capacidad de respuesta de la aplicación. - Permite ejecutar operaciones de I/O (entrada/salida) sin bloquear el flujo principal. - Facilita la escritura de código más legible en comparación con callbacks tradicionales.

Ejemplo Básico

public async Task<string> ObtenerDatosAsync()
{
await Task.Delay(2000); // Simula un proceso asíncrono
return "Datos obtenidos";
}

Ejercicios Prácticos con async & await

  1. Crear un método que espere 3 segundos y luego retorne un mensaje en consola.\
  2. Hacer una llamada asíncrona a una API pública usando HttpClient y mostrar el resultado.\
  3. Ejecutar varias tareas asíncronas en paralelo y combinar sus resultados.

Manejo de Tareas (Tasks)

La clase Task representa una operación asíncrona que puede devolver un resultado.
Existen diferentes formas de declarar y utilizar tareas en C#.

Ejemplo con Task simple

public async Task ProcesoSimple()
{
await Task.Delay(1000);
Console.WriteLine("Proceso completado");
}

Ejemplos de Task con Diferentes Tipos de Retorno

Task<IEnumerable<string>>

public async Task<IEnumerable<string>> ObtenerNombresAsync()
{
await Task.Delay(500);
return new List<string> { "Ana", "Luis", "Carlos" };
}

Task<Dictionary<int, string>>

public async Task<Dictionary<int, string>> ObtenerDiccionarioAsync()
{
await Task.Delay(500);
return new Dictionary<int, string>
{
{ 1, "Uno" },
{ 2, "Dos" },
{ 3, "Tres" }
};
}

Task<object>

public async Task<object> ObtenerObjetoAsync()
{
await Task.Delay(500);
return new { Id = 1, Nombre = "Ejemplo" };
}

Task<(int, string)>

public async Task<(int, string)> ObtenerTuplaAsync()
{
await Task.Delay(500);
return (1, "Dato");
}

Task<int>

public async Task<int> CalcularSumaAsync(int a, int b)
{
await Task.Delay(500);
return a + b;
}