【问题标题】:Parallel performing several tasks并行执行多项任务
【发布时间】:2014-08-26 07:11:00
【问题描述】:
  • 注意:这是针对 winrt 通用应用程序 *

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

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

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

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

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

关于如何使其表现更好的任何建议?

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

【问题讨论】:

  • GetAthlete 方法是否繁重到使其异步?事实上,在这个问题的背后,还有一个问题,你从哪里获取数据?数据库?一个网站?内存?如果是数据库,将GetAthlete的查询组合成一个查询,效率会高很多,如果是从内存中,则不需要使GetAthlete异步,如果是来自网站,则使用@ 987654327@ 可能会有所帮助。
  • 我会在问题中添加更多细节...
  • Parallel.Foreach() 怎么样?活动将被拆分为多个子集合,并且它们的迭代将被计划到 ThreadPool。并且可以同步获取每一个运动员的数据。
  • 我不认为 Parallel.ForEach 可用于 winrt 通用。但我可能是错的。
  • @Depechie Platforms - Windows Phone 8.1, Windows Phone 8, Windows 8.1 msdn.microsoft.com/library/dd992001(v=vs.110).aspx

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


【解决方案1】:

嗯,如果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;
}

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

【讨论】:

  • 您在通话期间使用 Task.AwaitAll 阻塞了 UI,不是吗?
  • await Task.WhenAll(results.Select(t => t.AthleteTask));
  • @CédricBignon 确实是我的错误,WhenAll 是正确的方法。
  • 当我再次使用我的开发电脑时,我需要检查代码:)
  • 好的,这行得通!但是现在我被困在如何最好地为此实现缓存......因为现在所有任务都是并行触发的,所以当所有任务启动并启动时,我的 ConcurrentDictionary 似乎没有“命中”。换句话说,现在我要为同一个运动员 ID 上网几次。
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多