Async Streams e IAsyncEnumerable en C#
Async Streams e IAsyncEnumerable<T> permiten devolver secuencias de datos de forma
asincrónica usando await foreach.
Introducidos en C# 8, son ideales para escenarios donde los datos se producen a lo largo del tiempo, como
lectura de archivos, resultados de consultas paginadas o streaming desde la red.
Definir un método que devuelve IAsyncEnumerable
Puedes usar la palabra clave async con yield return para producir elementos
asincrónicamente.
public async IAsyncEnumerableGenerarNumerosAsync() { for (int i = 1; i <= 5; i++) { await Task.Delay(500); yield return i; } }
Aquí cada elemento se produce tras una espera simulada.
Consumir un IAsyncEnumerable con await foreach
Puedes usar await foreach para iterar sobre los resultados asincrónicos.
await foreach (var numero in GenerarNumerosAsync()) {
Console.WriteLine($"Número: {numero}");
}
Esto procesa cada elemento a medida que se recibe, sin bloquear el hilo.
Escenarios comunes
Async Streams son útiles para procesar datos de APIs paginadas, resultados de bases de datos que se cargan en partes o procesamiento de logs en tiempo real. Permiten componer operaciones de forma eficiente sin cargar toda la colección en memoria.
Buenas Prácticas
Usa Async Streams para colecciones grandes o datos que llegan con latencia.
Controla la cancelación con CancellationToken para tareas largas.
Evita operaciones pesadas en el hilo de UI.
Documenta claramente el comportamiento asincrónico para facilitar el mantenimiento del código.