Reputation: 21440
This is the code from the image above:
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);
}
Edit: claims
is a List<Claim>
which I think is List<System.Security.Claim>
.
Upvotes: 2
Views: 3008
Reputation: 11963
Not sure about #1, but for #2 its because you called await on it
it should be
Task claimsResult = Task.WhenAll(_claimResults);
await claimsResult;
or omit the variable entirely if you don't need to delay the await somewhere else
Upvotes: 3
Reputation: 1502486
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);
or
await Task.WhenAll(_claimResults);
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();
... 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.)
Upvotes: 9