Wie zu verwenden Aufgabe.WhenAll() korrekt
Ich versuche, mit Task.WhenAll
zu erwarten den Abschluss mehrerer Aufgaben.
Mein code ist unten - soll es starten mehrere asynchrone Aufgaben, von denen jeder ruft einem bus der Linie und fügt Sie dann zu einem lokalen array. Allerdings Task.WhenAll(...)
sofort zurückgegeben, und die Anzahl der lokalen Routen array null ist. Dies scheint seltsam, da würde ich erwarten, dass die verschiedenen await
Aussagen innerhalb der einzelnen Task
bedeuten, dass der Fluss angehalten wird, und die Task
nicht zurück, bis es fertig ist.
List<Task> monitoredTasks = new List<Task>();
foreach (BusRouteIdentifier bri in stop.services)
{
BusRouteRequest req = new BusRouteRequest(bri.id);
//Start a new task to fetch the route for each stop
Task getRouteTask = Task.Factory.StartNew(async () =>
{
var route = await BusDataProviderManager.DataProvider.DataBroker.getRoute(req);
//Add the route to our array (on UI thread as it's observed)
await dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, delegate
{
this.routes.Add(route);
});
});
//Store the task in our monitoring list
monitoredTasks .Add(getRouteTask);
}
Debug.WriteLine("Awaiting WHENALL");
await Task.WhenAll(monitoredTasks );
Debug.WriteLine(string.Format("WHENALL returned (routes count is {0} ", this.routes.Count));
this.OnWillEndFetchingRoutes(new EventArgs());
Bin ich offensichtlich etwas falsch - aber was?
- haben Sie versucht, zu überprüfen, ob die endgültige
Task
ist nicht im fehlerhaften Zustand? - Ich denke, es könnte etwas falsch
await dispatcher
im inneren foreach-Schleife. UI-thread wird beobachtet und sofort angezeigt wird ? - Ja, sein Zustand ist RanToCompletion. Dem Staat alle Aufgaben, die im array sind RanToCompletion zu, obwohl, wenn ich tatsächlich prüfen Sie individuell, das Ergebnis der einzelnen Bereich ist WaitingForActivation
- Nicht sicher, was du meinst, UI, beobachten und anzeigen, aber nicht den 'warten' - Schlüsselwort bedeutet, dass die Ausführung nicht zurück, bis die Methode beendet wurde?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese wurde auf einem grundlegenden Mangel an Verständnis, wie die async-await funktioniert wirklich.
Die innere Aufgabe wurde wieder fließen, um die äußere Aufgabe, die dann fertig, bevor die erwarten je zurückgekehrt.
Zu erreichen, was ich wollte, musste ich umgestalten, wie folgt:
Dank Dave Smits
Ich vermute das problem ist der Aufruf
Task.Factory.StartNew()
. Ich vermute, Sie sind am Ende mit einemTask<Task>
, und du bist nur herausfinden, wenn es effektiv begann die Aufgabe.Versuchen Sie dies: