我通过使用异步方法从服务中获取数据:
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名独特的运动员(但视用户而定,这可能会增加)。
答案 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;
}
(写的是我的头脑,即没有语法检查,所以一些方法调用可能是错误的)