【问题标题】:await multiple tasks and access results等待多个任务并访问结果
【发布时间】:2019-10-07 00:29:19
【问题描述】:

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

我可以在循环中创建任务并使用 Task.WhenAll 来等待它们,但我不知道如何访问每个等待任务的结果。我尝试了以下但未定义结果。

    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);
    }

【问题讨论】:

  • 当你等待任务时。whenall 你会得到一个数组中的所有结果。
  • 我相信你在错误的地方检查异常:调用tasks.Add(…)时你不会看到异常,但你会看到一些任务是faulted为引发了未处理的异常。
  • 使用await关键字一般比通过访问.Result来阻塞要好:Services[] services = await Task.WhenAll(tasks);
  • @stannius 没有任何阻塞(至少在所示的第二次尝试中没有)。我只是做错了循环。

标签: c# asynchronous


【解决方案1】:

您正在(在 foreach 上)迭代到 Task 变量(没有类型化的 Result),您需要迭代到 Task&lt;Service&gt; 变量(或使用 var,因为您的tasks 列表已输入),即:

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

【讨论】:

    【解决方案2】:

    我错过了循环中任务的通用部分。改变了这个

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

    到这里

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

    现在可以了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多