并行执行几项任务

时间:2014-08-26 07:11:00

标签: c# windows-phone-8 winrt-async

  • 注意:这适用于winrt Universal app *

我通过使用异步方法从服务中获取数据:

var activityList = await Task.Run(() => dataService.GetActivitiesAsync());

但是对于每项活动,我仍然需要加载运动员数据。 所以现在我只是循环活动并像这样加载运动员数据(运动员没有批量加载选项):

foreach(var activity in activityList)
{
    activity.Athlete = dataService.GetAthleteAsync(activity.AthleteID);
}

但是这个GetAthleteAsync也将返回一个Task,所以我只是想知道是不是有更好的方法在后台线程中完成这个?以某种方式使用Task.WhenAll还是其他什么? Activity对象上的Athlete属性具有NotifyPropertyChanged,因此UI将在设置时显示所需的数据。 GetAthleteAsync方法已经尝试根据给定的id缓存运动员。

有关如何使其表现更佳的任何建议吗?

一些细节,所有方法都连接到Web API。 大多数情况下,我们会定位10名独特的运动员(但视用户而定,这可能会增加)。

1 个答案:

答案 0 :(得分:1)

Hms,如果dataService.GetActivitiesAsync()是异步的并且所有内容都是从UI线程调用的,那么你可以做的是:

// no wrapping in Task, it is async
var activityList = await dataService.GetActivitiesAsync();

// Select a good enough tuple
var results = (from activity in activityList
               select new { 
                Activity = activity, 
                AthleteTask = dataService.GetAthleteAsync(activity.AthleteID)
               }).ToList(); // begin enumeration

// Wait for them to finish, ie relinquish control of the thread
await Task.WhenAll(results.Select(t => t.AthleteTask));

// Set the athletes
foreach(var pair in results)
{
  pair.Activity.Athlete = pair.AthleteTask.Result;
}

(写的是我的头脑,即没有语法检查,所以一些方法调用可能是错误的)