Ich habe diese iterator- Rückgabetyp IEnumerable<Task<Event>>
ist so, dass ich später für jedes Element erwarten kann:Await für IEnumerable Artikel, (warten nach await)
private IEnumerable<Task<Event>> GetEventsAsync(long length)
{
var pos = _reader.BaseStream.Position;
while (_reader.BaseStream.Position - pos < length)
{
yield return ReadEvent(); // this method is async
}
}
Jetzt möchte ich diesen Konstruktor zu übergeben.
private async Task<EventManager> ReadEventManagerAsync()
{
// some other stuff
var length = Reverse(await _reader.ReadInt32()); // bytes to read
var events = GetEventsAsync(length); // cant await iterator. so use linq
return new EventManager(events.Select(async e => await e).Select(x => x.Result));
}
Der Konstruktor übernimmt diesen Parameter.
internal EventManager([NotNull, NoEnumeration]IEnumerable<Event> events) {...}
Wird dieser Code asynchron ausgeführt?
Weil ich nicht in Lambda warten kann, selbst wenn Methode als async markiert ist. Ich habe versucht, etwas zu hacken.
Ich verstehe, warum Select(async e => await e)
kehrt IEnumerable<Task<Event>>
weil async e => await e
Asynchron-Methode ist, die Rückgabetyp innerhalb Task
gewickelt werden muss
Meine Frage ist, wird .Select(x => x.Result)
noch async laufen? weil ich auf Artikel davor warte, das sollte kein Problem sein, oder? dies sein wie das Schreiben
await e;
return e.Result; // is it safe?
Ich will nicht Task.WhenAll verwenden, weil das wird alle Sachen aufzählen, und das ist das, was ich versuche zu vermeiden. Ich möchte diesen Iterator unberührt lassen, bis er im Konstruktor übergeben wird. Ich möchte die Ausführung aufgeschoben halten. (Ich werde Factory-Methode verwenden, wenn dieser Ansatz nicht möglich ist)
Wenn Sie diese Abfrage im Konstruktor nicht aufzählen, wird sie überhaupt nicht ausgeführt. Bitte zeigen Sie den Konstruktorcode –
Ich verstehe, ich lese diese Abfrage im Konstruktor. Ich benutze eine Reihe von selbstgemachten Methoden, so dass es nicht wirklich hilft. Ich habe so etwas wie 'UnknownEvents = events.Sieve (AEvents) .Sieve (BEvents) .ToReadOnlyCollection (x => x); 'das wird alle Dinge aufzählen. @SergeyBerezovskiy –
Ausbeute funktioniert nicht mit erwarten wie erwartet, kann nächste C# Version wird eine bessere Bereitstellung haben. Ab jetzt müssen Sie das Ereignis nur noch in einer Liste abwarten und speichern, werfen Sie einen Blick auf meine Antwort. Auch wenn Ihr ReadEvent von 'Stream.Position' abhängt, können Sie' Task.WhenAll' oder einen anderen Weg nicht verwenden, sondern einfach das Ergebnis in einer Liste auflisten und speichern. –