Ich muss mehrere asynchrone Aufgaben in einer Konsolenanwendung ausführen und warten, bis sie alle abgeschlossen sind, bevor ich sie weiter verarbeite.
Es gibt viele Artikel da draußen, aber ich scheine umso verwirrter zu werden, je mehr ich lese. Ich habe die Grundprinzipien der Aufgabenbibliothek gelesen und verstanden, aber irgendwo fehlt mir eindeutig ein Link.
Ich verstehe, dass es möglich ist, Aufgaben so zu verketten, dass sie nach Abschluss eines anderen beginnen (was so ziemlich das Szenario für alle Artikel ist, die ich gelesen habe), aber ich möchte, dass alle meine Aufgaben gleichzeitig ausgeführt werden, und ich möchte es einmal wissen Sie sind alle fertig.
Was ist die einfachste Implementierung für ein solches Szenario?
quelle
await Task.WhenAll(task1, task2);
?Task.WhenAll
startet die Aufgaben nicht für Sie. Sie müssen sie "heiß" bereitstellen, dh bereits gestartet.StartNew
Drehen neuer Aufgaben mit dem asynchronen Warten auf alle zu tun?Sie können viele Aufgaben erstellen wie:
quelle
Die beste Option, die ich gesehen habe, ist die folgende Erweiterungsmethode:
Nennen Sie es so:
Oder mit einem asynchronen Lambda:
quelle
Sie können verwenden,
WhenAll
welche einen erwartetenTask
oderWaitAll
keinen Rückgabetyp zurückgeben und die weitere Codeausführung blockieren,Thread.Sleep
bis alle Aufgaben abgeschlossen, abgebrochen oder fehlerhaft sind.Beispiel
Wenn Sie die Aufgaben in einer bestimmten Reihenfolge ausführen möchten, können Sie sich von dieser Antwort inspirieren lassen.
quelle
await
für jede Operation und gleichzeitig verwendenWaitAll
oderWhenAll
. Sollten Aufgaben bei derTask[]
Initialisierung nicht ohne seinawait
?Möchten Sie die
Task
s verketten oder können sie parallel aufgerufen werden?Zum Verketten
Mach einfach so etwas
und vergessen Sie nicht, die vorherige
Task
Instanz in jeder zu überprüfen,ContinueWith
da dies möglicherweise fehlerhaft ist.Für die parallele Art
Die einfachste Methode, auf die ich gestoßen bin:
Parallel.Invoke
Andernfalls gibt esTask.WaitAll
oder Sie können sogarWaitHandle
s verwenden, um einen Countdown bis zu null verbleibenden Aktionen durchzuführen (warten Sie, es gibt eine neue Klasse :)CountdownEvent
oder ...quelle
So mache ich es mit einem Array Func <> :
quelle
Noch eine Antwort ... aber ich befinde mich normalerweise in einem Fall, in dem ich Daten gleichzeitig laden und in Variablen einfügen muss, wie:
quelle
LoadCatsAsync()
undLoadDogAsync()
nur Datenbankaufrufe sind, sind sie E / A-gebunden.Task.Run()
ist für CPU-gebundene Arbeit; Es fügt zusätzlichen unnötigen Overhead hinzu, wenn Sie nur auf eine Antwort vom Datenbankserver warten. Yuvals akzeptierte Antwort ist der richtige Weg für IO-gebundene Arbeit.Ich habe einen Code vorbereitet, um Ihnen zu zeigen, wie Sie die Aufgabe für einige dieser Szenarien verwenden können.
quelle