Ich versuche Task.WaitAll
in einer Liste von Aufgaben zu verwenden. Die Aufgabe ist ein asynchrones Lambda, das Tasks.WaitAll
bricht, da es nie wartet.
Hier ist ein Beispielcode-Block:
%Vor%Dies wartet nicht wegen des asynchronen Lambdas. Also, wie soll ich I / O-Operationen in meinem Lambda erwarten?
Task.Factory.StartNew
erkennt async
delegates nicht, da keine Überladung vorliegt, die eine Funktion akzeptiert, die Task
zurückgibt.
Dies und andere Gründe (siehe StartNew ist gefährlich ) sollten Sie sein Verwenden von Task.Run
hier:
Dies wartet nicht wegen des asynchronen Lambdas. Wie soll ich das denn? Warten auf E / A-Operationen in meinem Lambda?
Der Grund, warum Task.WaitAll
nicht auf den Abschluss der IO-Arbeit wartet, die von Ihrem asynchronen Lambda dargestellt wird, ist, weil Task.Factory.StartNew
tatsächlich eine Task<Task>
zurückgibt. Da Ihre Liste ein List<Task>
ist (und Task<T>
von Task
abgeleitet ist), warten Sie auf die äußere Aufgabe, die von StartNew
gestartet wurde, während das innere ignoriert, das vom asynchronen Lambda erstellt wurde. Deshalb sagen sie Task.Factory.StartNew
ist gefährlich in Bezug auf async.
Wie konntest du das reparieren? Sie könnten Task<Task>.Unwrap()
explizit aufrufen, um die innere Aufgabe zu erhalten:
Oder wie andere gesagt haben, könnten Sie stattdessen Task.Run
aufrufen:
Auch, weil Sie die Dinge richtig machen wollen, sollten Sie Task.WhenAll
verwenden, warum asynchron verzichtbar ist, anstatt Task.WaitAll
, das synchron blockiert:
Tags und Links .net c# task-parallel-library async-await