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?
InformationsquelleAutor Carlos P | 2012-08-14
Schreibe einen Kommentar