programacion for español comandos codigos basicos c# .net asynchronous iterator clr

c# - for - Tarea de iterador asíncrono<IEnumerable<T>>



codigos de programacion c# (3)

Estoy tratando de implementar una función asíncrona que devuelve un iterador. La idea es la siguiente:

private async Task<IEnumerable<char>> TestAsync(string testString) { foreach (char c in testString.ToCharArray()) { // do other work yield return c; } }

Sin embargo, hay un mensaje de error que Task<IEnumerable<char>> que la función no puede ser un bloque de iterador porque la Task<IEnumerable<char>> no es un tipo de interfaz de iterador. ¿Hay una solución?


Para elaborar las respuestas anteriores, puede utilizar la familia de métodos Observable.Create<TResult> para hacer exactamente lo que desea.

Aquí hay un ejemplo:

var observable = Observable.Create<char>(async (observer, cancel) => { for (var i = 0; !cancel.IsCancellationRequested && i < 100; i++) { observer.OnNext(await GetCharAsync()); } });

Aquí le mostramos cómo puede usarlo en LINQPad, por ejemplo:

// Create a disposable that keeps the query running. // This is necessary, since the observable is 100% async. var end = Util.KeepRunning(); observable.Subscribe( c => Console.WriteLine(c.ToString()), () => end.Dispose());


Parece que lo que realmente estás buscando es algo como IObservable<T> , que es algo así como un IEnumerable<T> asíncrono basado en IEnumerable<T> . Consulte Reactive Extensions, también conocido como Rx de Microsoft Open Technologies (código con licencia de Apache-2.0) (sin afiliación) para una gran cantidad de métodos que funcionan con IObservable<T> para que funcione como LINQ-to-Objects y más.

El problema con IEnumerable<T> es que no hay nada que realmente haga que la enumeración sea asíncrona. Si no desea agregar una dependencia en Rx (que es lo que realmente hace IObservable<T> ), esta alternativa podría funcionar para usted:

public async Task<IEnumerable<char>> TestAsync(string testString) { return GetChars(testString); } private static IEnumerable<char> GetChars(string testString) { foreach (char c in testString.ToCharArray()) { // do other work yield return c; } }

aunque me gustaría señalar que sin saber lo que realmente se está haciendo de forma asíncrona, puede haber una manera mucho mejor de lograr sus objetivos. Ninguno de los códigos que ha publicado realmente hará algo asincrónico, y realmente no sé si algo en // do other work es asíncrono (en cuyo caso, esto no es una solución para su problema subyacente, aunque hará que su código compilar).


Una implementación más "incluida con baterías" de este tipo de cosas, incluida la compatibilidad con idiomas, se está considerando actualmente (en el momento de escribir este artículo) para su inclusión en C # 8.0.

Como lo entiendo, esto está sujeto a cambios en cualquier momento.