IAsyncEnumerable es una potente característica introducida en C# 8.0 que nos permite trabajar con una secuencia de datos de forma asincrónica. Como sugiere el nombre, IAsyncEnumerable es la contraparte asincrónica de IEnumerable, la interfaz que nos permite iterar fácilmente a través de los elementos de una colección. Curiosamente, la interfaz IAsyncEnumerable funciona con un enfoque basado en extracción, donde se creará o se creará el siguiente elemento. recuperados cuando lo solicite el consumidor. A diferencia de IEnumerable, que espera a que se cree el siguiente elemento, IAsyncEnumerable devuelve un elemento en espera que se puede reanudar más adelante. En este artículo, examinaremos cómo podemos usar la interfaz IAsyncEnumerable en C# para trabajar con flujos de datos asincrónicos. Cree un proyecto de aplicación de consola en Visual StudioEn primer lugar, creemos un proyecto de aplicación de consola .NET Core en Visual Studio. Suponiendo que Visual Studio 2022 esté instalado en su sistema, siga los pasos que se describen a continuación para crear un nuevo proyecto de aplicación de consola .NET Core en Visual Studio. Inicie el IDE de Visual Studio. Haga clic en «Crear nuevo proyecto». En la ventana «Crear nuevo proyecto», seleccione «Aplicación de consola (.NET Core)» de la lista de plantillas que se muestran. Haga clic en Siguiente. En la ventana «Configura tu nuevo proyecto», especifica el nombre y la ubicación del nuevo proyecto. Haga clic en Siguiente. En la ventana «Información adicional» que se muestra a continuación, elija «.NET 7.0 (soporte estándar)» como la versión de Framework que le gustaría usar. Haga clic en Crear. Usaremos este proyecto de aplicación de consola .NET 7 para trabajar con los ejemplos de código que se muestran en las secciones siguientes de este artículo. Beneficios de IAsyncEnumerable Los beneficios clave de IAsyncEnumerable incluyen los siguientes: Compatibilidad con transmisión asincrónica: una colección tradicional como una lista o IEnumerable requiere que todos los elementos estén disponibles con antelación. IAsyncEnumerable, por otro lado, transmite elementos a medida que están disponibles. El uso de IAsyncEnumerable es especialmente beneficioso cuando se trata de grandes conjuntos de datos o flujos de datos en tiempo real donde es posible que no todos los datos estén disponibles de antemano. Con IAsyncEnumerable, puede comenzar a procesar elementos inmediatamente sin tener que esperar a que el conjunto de datos se cargue en su totalidad. Cuando se trabaja con fuentes de datos en tiempo real, como cotizaciones de acciones o actualizaciones de redes sociales, donde constantemente se genera nueva información y es necesario procesarla tan pronto como esté disponible, esta flexibilidad es beneficiosa. Uso eficiente de los recursos disponibles: IAsyncEnumerable le permite trabajar con grandes secuencias de datos de forma asincrónica, lo que garantiza que no se desperdicien valiosos recursos informáticos. Rendimiento mejorado: IAsyncEnumerable puede mejorar el rendimiento de su aplicación al eliminar la necesidad de cargar todos los datos de una sola vez. En consecuencia, el sistema puede utilizar menos memoria y liberar recursos. Capacidad de respuesta mejorada: con IAsyncEnumerable, puede escribir fácilmente código que maneje grandes flujos de datos de manera responsiva. También puede utilizar los recursos de manera más eficiente y mejorar el rendimiento general de la aplicación, de modo que su aplicación siga respondiendo incluso cuando trabaje con grandes conjuntos de datos. Código más simple: IAsyncEnumerable simplifica el código al eliminar mecanismos de sincronización complejos, como bloqueos y semáforos, reduciendo así la probabilidad de interbloqueos y otros problemas relacionados con la sincronización en su aplicación. En la siguiente sección, examinaremos algunas operaciones avanzadas que puede realizar en secuencias asincrónicas de datos usando IAsyncEnumerable. Filtrado con IAsyncEnumerable El siguiente fragmento de código ilustra cómo puede filtrar una secuencia asincrónica de datos para recuperar solo los números pares. asíncrono público IAsyncEnumerable GetEvenNumbersAsync(IEnumerable enteros) { foreach (var n en enteros) { await Task.Delay(500); if (n % 2 == 0) { rendimiento retorno n; } } }Agregación con IAsyncEnumerableEl siguiente fragmento de código ilustra cómo puede aprovechar IAsyncEnumerable para calcular la suma de números enteros en una secuencia asincrónica de números.tarea asíncrona pública GetSumAsync(IEnumerable enteros) { int suma = 0; await foreach (var n en GetNumbersAsync(enteros)) { suma += n; } suma devuelta; }Proyección asincrónica con IAsyncEnumerableEl siguiente fragmento de código muestra cómo puede usar proyecciones con IAsyncEnumerable.public async IAsyncEnumerable GetNumbersUsingProjectionAsync(IEnumerable enteros) { foreach (var n en enteros) { await Task.Delay(500); rendimiento retorno await Task.Run(() => n * 10); } }Transformar una secuencia con IAsyncEnumerableEl siguiente fragmento de código muestra cómo puede aprovechar IAsyncEnumerable para transformar una secuencia de números y generar los valores transformados.public async IAsyncEnumerable TransformNumbersAsync(IEnumerable enteros) { foreach (var n en enteros) { await Task.Delay(500); rendimiento retorno n.ToString(); } }Procesamiento por lotes con IAsyncEnumerableAdemás de recuperar elementos uno a la vez, también puede procesar elementos en lotes cuando trabaja con IAsyncEnumerable. Esto se muestra en el fragmento de código que se proporciona a continuación. asíncrono estático público IAsyncEnumerable> Procesar lote(IAsyncEnumerable fuente, tamaño int, CancellationToken cancelationToken = predeterminado) { var lote = nueva lista(); await foreach (var elemento en fuente) { if (cancellationToken.IsCancellationRequested) interrupción de rendimiento; lote.Agregar(artículo); if (batch.Count >= tamaño) { lote de devolución de rendimiento; lote = nueva lista(); } } if (batch.Count > 0) { lote de devolución de rendimiento; } }Almacenamiento en búfer con IAsyncEnumerableTambién puede aprovechar el almacenamiento en búfer para obtener un mejor rendimiento al procesar elementos de forma asincrónica.public static async IAsyncEnumerable Búfer de proceso(este IAsyncEnumerable fuente, tamaño int, CancellationToken cancelationToken = predeterminado) { var cola = nueva cola(); await foreach (var elemento en fuente) { if (cancellationToken.IsCancellationRequested) interrupción de rendimiento; cola.En cola (elemento); while (queue.Count >= tamaño) { rendimiento return queue.Dequeue(); } } while (queue.Count > 0) { rendimiento return queue.Dequeue(); } }Conclusión Como hemos visto, IAsyncEnumеrable proporciona varias características poderosas que se pueden aplicar a secuencias asincrónicas. Además, puede utilizar IAsyncEnumerable con operadores LINQ para realizar diversas operaciones que incluyen, entre otras, filtrar, transformar y agregar grandes conjuntos de datos. También puede controlar los errores de tiempo de ejecución que pueden ocurrir cuando trabaja con IAsyncEnumerable y puede aprovechar los reintentos e implementar el registro para controlar dichos errores correctamente. Copyright © 2023 IDG Communications, Inc.

Source link