为什么Task.WhenAll返回void?

use*_*388 2 c# linq asp.net-mvc task

在此输入图像描述

这是上图中的代码:

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);
}
Run Code Online (Sandbox Code Playgroud)
  1. 为什么LINQ表达式不起作用,而foreach确实如此.LINQ表达式在执行时为我提供了"底层提供程序无法打开"异常.
  2. 为什么Task.WhenAll()在返回类型为Task时返回void?

编辑: claimsList<Claim>,我认为是List<System.Security.Claim>.

Jon*_*eet 9

WhenAll返回a Task,但是你正在等待那个任务.等待平原Task(而不是a Task<T>)没有结果.所以你要么:

Task claimsResult = Task.WhenAll(_claimResults);
Run Code Online (Sandbox Code Playgroud)

要么

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

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

var _claimsResults = claims.Select(claim => UserManager.AddClaimAsync(user.Id, claim))
                           .ToList();
Run Code Online (Sandbox Code Playgroud)

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