Aufgabe.Factory.StartNew mit asynchronen lambda und Aufgabe.WaitAll
Ich versuche zu verwenden Task.WaitAll
auf eine Liste von Aufgaben. Die Sache ist, die Aufgaben sind eine asynchrone lambda bricht Tasks.WaitAll
wie Sie es noch nie wartet.
Hier ist ein Beispiel code-block:
List<Task> tasks = new List<Task>();
tasks.Add(Task.Factory.StartNew(async () =>
{
using (dbContext = new DatabaseContext())
{
var records = await dbContext.Where(r => r.Id = 100).ToListAsync();
//do long cpu process here...
}
}
Task.WaitAll(tasks);
//do more stuff here
Diese nicht warten, weil der async-lambda. Also, wie soll ich das warten auf I/O-Operationen in meinem lambda?
Was ist der Punkt, über den Start einer Aufgabe auf einen anderen thread, wenn das erste, was Sie tun, nachdem Sie es starten, ist block auf die
Task.WaitAll
nennen? Sie erhalten eine bessere Leistung loszuwerden ToListAsync
und machen es einfach ToList
und es läuft synchron. (oder wenn Sie verwenden möchten ToListAsync
dann müssen Sie die Verwendung von async-den ganzen Weg bis Ihre call-stack.InformationsquelleAutor Jacob Roberts | 2015-06-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Task.Factory.StartNew
nicht erkennenasync
Delegierten, da es keine überlastung, übernimmt eine Funktion Rückgabe einesTask
.Diesem und anderen Gründen (siehe StartNew ist gefährlich) ist, warum Sie verwenden sollten
Task.Run
hier:Schade, Aufgabe.führen Sie nicht geben Sie
TaskCreationOptions
Task.Factory.StartNew(Func<Task> function
scheint .NET Standard 1.6 - man hätteUnwrap()
die daraus resultierendenTask
aber 🙂InformationsquelleAutor Charles Mager
Den Grund
Task.WaitAll
nicht warten, für die Fertigstellung des IO-Arbeit vorgestellt, die durch die asynchrone lambda ist, daTask.Factory.StartNew
tatsächlich gibt eineTask<Task>
. Da Eure Liste istList<Task>
(undTask<T>
stammt ausTask
), Sie warten auf die äußere Aufgabe wurde gestartet durchStartNew
, während ignorieren die innere erstellt durch die asynchrone lambda. Dies ist, warum Sie sagenTask.Factory.StartNew
ist gefährlich mit Bezug auf async.Wie könnte man dieses Problem beheben? Sie könnten explizit aufrufen
Task<Task>.Unwrap()
um die innere Aufgabe:Oder wie andere sagten, Sie nennen könnte
Task.Run
statt:Auch, denn Sie wollen die Dinge richtig tun, werden Sie verwenden möchten
Task.WhenAll
warum ist asynchron wartemöglichkeit, stattTask.WaitAll
welche synchron Blöcke:InformationsquelleAutor Yuval Itzchakov
Können Sie dies so tun.
Task.WaitAll
wenn Sieasync
da kann man leicht einen deadlock.WaitAll ist, was Jakob tun wollte, nach der Frage.
InformationsquelleAutor hebinda
verwenden Sie den
Task.ContinueWith
Methode. Wie dieseInformationsquelleAutor couven92