并行执行多项任务
本文关键字:任务 并行执行 | 更新日期: 2023-09-27 18:19:28
- 注意:这适用于winrt Universal应用程序*
我通过使用异步方法从服务中获取数据:
var activityList = await Task.Run(() => dataService.GetActivitiesAsync());
但对于每个活动,我仍然需要加载运动员数据。所以现在我只循环活动并加载运动员数据,就像这样(运动员没有批量加载选项):
foreach(var activity in activityList)
{
activity.Athlete = dataService.GetAthleteAsync(activity.AthleteID);
}
但是这个GetAthletSync也会返回一个Task,所以我只是想知道是否有更好的方法在后台线程中完成这项工作?不知怎么的,任务。WhatAll还是其他什么?Activity对象上的Athlete属性具有NotifyPropertyChanged,因此UI将在设置后显示所需的数据。GetAthleteAsync方法已经尝试根据给定的id缓存运动员。
关于如何使其表现更好,有什么建议吗?
一些细节,所有方法都连接到web API。大多数情况下,我们将针对10名独特的运动员(但根据用户的不同,这一数字可能会增加)。
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;
}
(我是凭直觉写的,即没有语法检查,所以一些方法调用可能是错误的)