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 IAsyncEnumerable GenerarNumerosAsync() {
    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.

Ver también

Documentación oficial de Microsoft

Ver más en Microsoft Docs