Im Wesentlichen das ich versuche, der Lage sein, zu tun:Ist es möglich, eine Liste asynchroner Elemente in einer asynchronen Methode von einer asynchronen Quelle zurückzugeben?
var thingTasks = thingFactory.GetMyThings();
// ...
var things = await thingTasks;
Ich versuche, aus einer Liste von Objekten zu beginnen, diese Liste durchlaufen für jeden einen async
Anruf tätigen, und die Rückkehr des Satzes von Ergebnisse in einer await
-Möglichkeit, so dass der Verbraucher wählen kann, wann zu await
es. GetMyThings
selbst verwendet await
bevor die Liste zu erzeugen, so muss es async
selbst und ist so etwas wie sein:
public async Task<List<Thing>> GetMyThings() {
var thingMakers = await GetThingMakers();
var things = thingMakers.Select(async thing => await thing.GetAsync());
return things;
}
Die Grundidee ist, dass ich einige await
Linien haben, dann nach, dass ich die Ergebnisse dieser Linien verwenden, um eine Liste erstellen und jedes Element generieren erfordert auch einen async
Aufruf. Ich versuche zu vermeiden, innerhalb der Methode zu blockieren (z. B. .Result
) und stattdessen diese Verantwortung/Gelegenheit zurück an den Anrufer übergeben. Grundsätzlich starten Sie die Aufgaben in der Liste aber nicht await
ihnen. Dies bringt mich natürlich dazu, Task<List<Thing>>
oder 'List> `zurückgeben zu wollen.
Die nächstgelegene ich bekam, war return Task.WhenAll(things)
aber das hat nicht funktioniert (es brauchte Task<Task<Thing[]>>
und await await GetMyThings()
sein. Alternativ return Select(...)
ein Task<List<Task<Thing>>>
Rückkehr und ein await Task.WhenAll(await GetMyThings())
auf der konsumierende Seite benötigen.
In beiden Fällen braucht man doppelt await
Aussagen, die Liste zu erkennen. ich denke, es ist unmöglich, aber ist es eine Möglichkeit, die doppelte await
zu vermeiden?
'async Sache => erwarten thing.GetAsync()' 'ist nur Sache => thing.GetAsync() 'das ist auch das gleiche wie' GetAsync'. Kein unnötiges Umwickeln. – Servy
Wenn Sie möchten, dass der Aufrufer die Ergebnisse nicht auspacken muss, lassen Sie die Ergebnisse von der Methode selbst entpacken, bevor Sie sie zurückgeben. Die Methode kann die Ergebnisse genau so entpacken, wie der Anrufer es getan hat. – Servy