Das folgende Snippet kompiliert, aber ich würde erwarten, dass es auf das Task-Ergebnis wartet, anstatt mir eine List<Task<T>>
zu geben.Was passiert eigentlich, wenn in einer LINQ-Anweisung async/wait verwendet wird?
var foo = bars.Select(async bar => await Baz(bar)).ToList()
Wie bereits ausgeführt here, müssen Sie Task.WhenAll
verwenden:
var tasks = foos.Select(async foo => await DoSomethingAsync(foo)).ToList();
await Task.WhenAll(tasks);
Aber a comment weist darauf hin, dass die async
und await
innerhalb des Select()
ist nicht erforderlich:
var tasks = foos.Select(foo => DoSomethingAsync(foo)).ToList();
Ein ähnliches Frage here wo jemand versucht, eine asynchrone Methode in einem verwenden Where()
.
Also async
und await
innerhalb einer LINQ-Anweisung ist rechtliche Syntax, aber tut es überhaupt nichts oder hat es eine bestimmte Verwendung?
"Es gibt keine wichtigen Unterschiede." - Wenn BazAsync synchron auslöst und das nicht asynchrone Lambda bei der Enumeration und Verwendung des asynchronen Lambdas verwendet wird, geschieht dies, während die Tasks abgewartet werden. –
@EliArbel: Ja. Aber eine asynchrone synchrone Methode ist ein sehr ungewöhnlicher Fall. Async-Methoden sollten * nur * Sync-Ausnahmen auslösen, wenn sie [boneheaded Ausnahmen] sind (https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/). Daher halte ich das für keinen wichtigen Anwendungsfall. –
verfassen - https://en.wikipedia.org/wiki/Retification_(computer_science) – BozoJoe