Estoy tratando de usar la Tarea.Cuando todos esperan la finalización de múltiples tareas.Cómo usar Task.WhenAll() correctamente
Mi código está a continuación: se supone que debe iniciar varias tareas asíncronas, cada una de las cuales recupera una ruta de bus y luego las agrega a una matriz local. Sin embargo, Task.WhenAll (...) devuelve inmediatamente y el recuento de la matriz de rutas locales es cero. Esto parece extraño, ya que esperaría que las diversas declaraciones 'en espera' dentro de cada tarea signifiquen que el flujo está suspendido y la tarea no regresará hasta que haya finalizado.
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());
Obviamente estoy haciendo algo mal - pero ¿qué?
has comprobar si la final 'Task' no está en el estado de fallo? –
Creo que podría ser algo malo 'esperar despachador' dentro de foreach loop. El hilo de UI se observará y se mostrará de inmediato? –
@ie. Sí, su estado es RanToCompletion. El estado de todas las tareas del conjunto también es RanToCompletion, aunque cuando las inspecciono individualmente, el campo Resultado de cada una de ellas está en WaitingForActivation –