为什么Task.WhenAll返回void? [英] Why does Task.WhenAll return void?

查看:156
本文介绍了为什么Task.WhenAll返回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?

claims是一个List<Claim>,我认为是List<System.Security.Claim>.

claims is a List<Claim> which I think is List<System.Security.Claim>.

推荐答案

WhenAll返回Task,但是您正在等待该任务.等待普通的Task(而不是Task<T>)不会产生任何结果.所以你要么想要:

WhenAll returns a Task, but then you're awaiting that task. Awaiting a plain Task (rather than a Task<T>) gives no result. So you either want:

Task claimsResult = Task.WhenAll(_claimResults);

await Task.WhenAll(_claimResults);

我怀疑LINQ问题是因为您的foreach方法立即实现了查询-LINQ等效项是:

My suspicion is that the LINQ problem is because your foreach approach materializes the query immediately - the LINQ equivalent would be:

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

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

... where the ToList() method materializes the results immediately. (I've used the method call syntax rather than query expression syntax because query expressions are pretty pointless for trivial queries like this.)

这篇关于为什么Task.WhenAll返回void?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆