为什么Task.WhenAll返回void?

时间:2016-08-16 14:50:21

标签: c# asp.net-mvc linq task

enter image description here

这是上图中的代码:

if (claims != null && claims.Any())
{
    // firstly, why doesn't this work?
    // var _claimResults = from claim in claims select UserManager.AddClaimAsync(user.Id, claim);

    // but this does...
    List<Task> _claimResults = new List<Task>();
    foreach (var claim in claims)
    {
        _claimResults.Add(UserManager.AddClaimAsync(user.Id, claim));   
    }

    // secondly, why does Task.WhenAll return void when it clearly says it returns Task?
    Task claimsResult = await Task.WhenAll(_claimResults);
}
  1. 为什么LINQ表达式不起作用,而foreach确实如此。 LINQ表达式在执行时为我提供了“底层提供程序无法打开”异常。
  2. 为什么Task.WhenAll()在返回类型为Task时返回void?
  3. 修改: claimsList<Claim>我认为是List<System.Security.Claim>

2 个答案:

答案 0 :(得分:7)

WhenAll会返回Task,但您等待该任务。等待普通Task(而不是Task<T>)没有结果。所以你要么:

Task claimsResult = Task.WhenAll(_claimResults);

await Task.WhenAll(_claimResults);

我怀疑LINQ问题是因为你的foreach方法立即实现了查询 - LINQ等价物将是:

var _claimsResults = claims.Select(claim => UserManager.AddClaimAsync(user.Id, claim))
                           .ToList();

... ToList()方法立即实现结果。 (我使用了方法调用语法而不是查询表达式语法,因为对于像这样的简单查询,查询表达式毫无意义。)

答案 1 :(得分:2)

不确定#1,但#2因为你打电话等待它

应该是

Task claimsResult = Task.WhenAll(_claimResults);
await claimsResult;
如果你不需要在其他地方推迟等待,那么

或完全省略变量