我正在尝试使用Task.WhenAll
等待多个任务的完成。
我的代码如下 - 它应该启动多个异步任务,每个任务检索一条总线路线,然后将它们添加到本地数组中。然而,Task.WhenAll(...)
立即返回,本地路由数组的计数为零。这看起来很奇怪,因为我期望各种await
每个内的语句Task
意味着流量被暂停,并且Task
直到完成才返回。
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());
我显然做错了什么——但是什么?
这是因为对 async-await 的真正工作原理缺乏基本的了解。
内部任务将流程返回到外部任务,然后外部任务在等待返回之前完成。
为了实现我想要的,我需要重构如下:
List<Task<BusRoute>> routeRetrievalTasks = new List<Task<BusRoute>>();
foreach (BusRouteIdentifier bri in stop.services)
{
BusRouteRequest req = new BusRouteRequest(bri.id);
routeRetrievalTasks.Add(BusDataProviderManager.DataProvider.DataBroker.getRoute(req));
}
foreach (var task in routeRetrievalTasks)
{
var route = await task;
this.routes.Add(route); // triggers events
}
谢谢戴夫·史密茨 http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/51114ea5-0070-4285-b16e-231a895a6ad7
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)