Kann ich eine Aufzählung abwarten, die ich mit einem Generator erstellt habe?

Angenommen, ich habe eine Folge von Ganzzahlen, die ich asynchron erhalte.

async Task<int> GetI(int i){
    return await Task.Delay(1000).ContinueWith(x => i);
}

Ich möchte einen Generator für diese Sequenz erstellen. Wenn die Sequenz synchron wäre, würde ich Folgendes tun:

IEnumerable<int> Method()
{
    for (var i = 0; i < 100; i++)
    {
        yield return GetI(i); // won't work, since getI returns a task
    }
}

Also dachte ich, dass die Analogie den Generator asynchron macht und daraus ergibt:

async Task<IEnumerable<int>> Method()    
{
    for (var i = 0; i < 100; i++)
    {
        yield return await Task.Delay(1000).ContinueWith(x => i);
    }
}

Das geht nicht, da eine Methode mityield muss ein zurückgebenIEnumerable von etwas ist die alternative, die sinnvoller istIEnumerable<Task<int>> aber das wird seitdem nicht mehr kompiliertasync Methoden müssen zurückkehrenTasks oder nichtig.

Jetzt ist mir klar, dass ich einfach die Wartezeit entfernen und eine zurückgeben kannIEnumerable<Task<int>> Das hilft mir jedoch nicht weiter, da die Iteration immer wieder nach Daten fragt, bevor diese fertig sind, sodass mein Problem damit nicht behoben ist.

Gibt es eine Möglichkeit, Enumerables und Aufgaben mit dem netten Zucker, den die Sprache mir gibt, zu mischen, mit Erwartung und Ertrag?Gibt es eine Möglichkeit, es gut zu konsumieren?

(Wenn ich online suche, vermute ich, dass die Antwort auf die erste Frage falsch ist und die zweite eine beobachtbare / beobachtbare, aber ich konnte keine kanonische Referenz finden und bin an der besten Möglichkeit interessiert, dieses Muster in C # zu implementieren.)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage