Próbuję użyć Task.WhenAll, aby poczekać na zakończenie wielu zadań.Jak poprawnie używać Task.WhenAll()
Mój kod jest poniżej - ma uruchomić wiele zadań asynchronicznych, z których każda pobiera trasę magistrali, a następnie dodaje je do lokalnej tablicy. Jednak Task.WhenAll (...) zwraca natychmiast, a liczba lokalnych tablic tras wynosi zero. Wydaje się to dziwne, ponieważ oczekiwałbym, że różne "oczekiwania" w każdym zadaniu oznaczają, że przepływ jest zawieszony, a zadanie nie powraca, dopóki nie zostanie zakończone.
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());
Oczywiście robię coś nie tak - ale co?
Czy chciał sprawdzić, czy ostateczna 'Task' nie jest w stanie nic zarzucić? –
Myślę, że może być coś złego 'oczekuj wewnątrz pętli foreach 'wewnątrz dyspozytora. Wątek interfejsu użytkownika będzie obserwowany i wyświetlany natychmiast? –
@ie. Tak, jego stan to RanToCompletion. Stan wszystkich zadań w tablicy to również RanToCompletion, chociaż kiedy faktycznie je sprawdzam pojedynczo, pole wyniku każdego z nich to WaitingForActivation –