等待多个任务并访问结果

3

我需要运行多个可等待任务,然后将它们的结果汇总到一个列表中并返回。

我可以在循环中创建这些任务,并使用Task.WhenAll来等待它们,但我无法想出如何访问每个等待任务的结果。我尝试了下面的方法,但是Result未定义。

    List<Service> services = new List<Service>();
    List<Exception> exceptions = new List<Exception>();
    List<Task<Service>> tasks = new List<Task<Service>>();

    foreach (string serviceMoniker in monikers)
    {
      try
      {
        tasks.Add(GetService(serviceMoniker, tenantMoniker, countryCode, environmentId));
      }
      catch (Exception e) { exceptions.Add(e); }
    }

    var continuation = Task.WhenAll(tasks);

    for (int i=0; i < continuation.Result.Length - 1; i++)
    {
      services.Add(continuation.Result[i].Result);
    }

另一次尝试

    await Task.WhenAll(tasks);

    foreach (Task t in tasks)
    {
      services.Add(t.Result);
    }

2
当您使用await Task.WhenAll时,您将获得一个包含所有结果的数组。 - Nkosi
1
可能是 等待具有不同结果的多个任务 的重复。 - 500 - Internal Server Error
我相信你在错误的地方检查异常:当调用 tasks.Add(…) 时,你不会看到异常,但你会发现一些任务是 faulted,因为未处理的异常被抛出。 - stuartd
使用await关键字通常比通过访问.Result进行阻塞更好: Services[] services = await Task.WhenAll(tasks); - stannius
@stannius 没有任何阻塞(至少在第二次尝试中没有)。我只是循环做错了。 - ztorstri
2个回答

4
我错过了循环中任务的通用部分。已更正。"最初的回答"
await Task.WhenAll(tasks);

foreach (Task t in tasks)
{
  services.Add(t.Result);
}

to this

await Task.WhenAll(tasks);

foreach (Task<Service> t in tasks)
{
  services.Add(t.Result);
}

"最初的回答" 现在它可以运行。

4

您正在迭代(在 foreach 中)到一个没有类型化 ResultTask 变量,您需要迭代到一个 Task<Service> 变量(或使用 var,因为您的 tasks 列表已经有了类型),即:

foreach (var t in tasks)
{
  services.Add(t.Result);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接