Es klingt wie, was Sie wirklich suchen können, ist so etwas wie IObservable<T>
, die eine Art von Push-basierte asynchrone IEnumerable<T>
ist. Siehe Reactive Extensions, a.k.a. Rx von Microsoft Open Technologies (Code unter Apache-2.0 lizenziert) (keine Zugehörigkeit) für eine große Anzahl von Methoden, die mit IObservable<T>
arbeiten, damit es wie LINQ-to-Objects und mehr funktioniert.
Das Problem mit IEnumerable<T>
ist, dass es nichts gibt, das wirklich die Enumeration selbst asynchron macht. Wenn Sie nicht eine Abhängigkeit von Rx hinzufügen möchten (was wirklich ist, was IObservable<T>
Glanz macht), könnte diese Alternative für Sie arbeiten:
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;
}
}
obwohl ich möchte darauf hinweisen, dass, ohne zu wissen, was eigentlich asynchron durchgeführt wird, gibt es möglicherweise einen viel besseren Weg, um Ihre Ziele zu erreichen. Keiner der von Ihnen geposteten Code wird tatsächlich asynchron tun, und ich weiß nicht wirklich, ob irgendetwas in // do other work
asynchron ist (in diesem Fall ist dies keine Lösung für Ihr zugrunde liegendes Problem, obwohl es Ihren Code kompilieren wird).
Beachten Sie, dass dies nur besagt, dass * das Aufzählungszeichen an erster Stelle * asynchron ist - es macht es nicht zu einem asynchronen Enumerator. Was willst du eigentlich machen? Weil ich vermute, dass dies nicht erreicht wird. –
Überprüfen Sie http://asyncenum.codeplex.com/ – daryal
Ich möchte diese Funktion ausführen, um mit einem Stream in einem Worker-Thread zu arbeiten und das erwartete Ergebnis im UI-Thread zu verarbeiten. – user2341923