繁体   English   中英

为什么Task.WhenAll返回void?

[英]Why does Task.WhenAll return void?

在此输入图像描述

这是上图中的代码:

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?

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

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,因为你打电话等待它

它应该是

Task claimsResult = Task.WhenAll(_claimResults);
await claimsResult;

如果您不需要在其他地方延迟等待,则完全省略变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM