Task.Factory.StartNew mit async Lambda und Task.WaitAll

7

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?

    
Jacob Roberts 13.06.2015, 14:36
quelle

4 Antworten

10

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:

%Vor%     
Charles Mager 13.06.2015, 14:50
quelle
9
  

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:

%Vor%

Oder wie andere gesagt haben, könnten Sie stattdessen Task.Run aufrufen:

%Vor%

Auch, weil Sie die Dinge richtig machen wollen, sollten Sie Task.WhenAll verwenden, warum asynchron verzichtbar ist, anstatt Task.WaitAll , das synchron blockiert:

%Vor%     
Yuval Itzchakov 13.06.2015 16:42
quelle
0

Sie können so machen.

%Vor%     
hebinda 13.06.2015 14:55
quelle
-1

Sie müssen die Methode Task.ContinueWith verwenden. So,

%Vor%     
fredrik92 13.06.2015 14:43
quelle