并行执行多项任务

本文关键字:任务 并行执行 | 更新日期: 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;
}

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