这是上图中的代码:
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);
}
修改: claims
是List<Claim>
我认为是List<System.Security.Claim>
。
答案 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;
如果你不需要在其他地方推迟等待,那么或完全省略变量