异步填充字典

Jaf*_*s82 1 .net c# .net-core asp.net-core

我有一个简单的foreach循环(如下所示),它遍历一个集合并进行异步 API 调用以根据当前迭代器值获取数据。

foreach (var group in groups)
{
    var usersInGroup = await this.tableauService.GetUsersInTableauGroup(group.Id);

    // do work with `usersInGroup`
}
Run Code Online (Sandbox Code Playgroud)

我不想每次迭代都进行 API 调用,而是想为每个 API 调用创建一个异步任务并同时执行它们,结果填充以group.Id. 这可能吗?

在我的脑海中,代码看起来像:

IList<Task<string[]>> tasks = new List<Task<string[]>>();
IDictionary<string, string[]> dictionary = new Dictionary<string, string[]>();

foreach (var group in groups)
{
    tasks.Add(this.tableauService.GetUsersInTableauGroup(group.Id));
    // Somehow define callback of each task to hydrate dictionary
}

await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)

Str*_*ior 5

Task.WhenAll() 返回任务的所有值,因此您可以执行以下操作:

var tasks = groups
  .Select(async g => new 
  {
    g.Id, 
    Values = await this.tableauService.GetUsersInTableauGroup(g.Id)
  });
var results = await Task.WhenAll(tasks);
var dictionary = results
  .ToDictionary(r => r.Id, r => r.Values);
Run Code Online (Sandbox Code Playgroud)