如何在lambda表达式中正确使用async / await关键字?这是代码:
public async Task<IHttpActionResult> GetUsers() {
var query = await _db.Users.ToListAsync();
var users = query.Select(async u => new
{
FirstName = u.FirstName,
LastName = u.LastName,
IsGeek = await _userManager.IsInRoleAsync(u.Id, "Geek")
});
return Ok(users);
}
正如您所看到的,此代码在webapi控制器中运行,它编译时没有任何错误,问题是它需要额外 await
某处,因为此操作永远不会返回。
请注意,_db
和_usermanager
是应用的DbContext
和UserManager
。
感谢。
更新:
这个等效的代码永远不会失败(但它不是优雅的:():
var query = await _db.Users.ToListAsync();
var users = new List<object>();
foreach (var u in query)
{
bool IsGeek = await _userManager.IsInRoleAsync(u.Id, "IsGeek");
users.Add( new {
FirstName = u.FirstName,
LastName = u.LastName,
IsGeek= IsGeek
});
}
return Ok(users);
答案 0 :(得分:9)
考虑你的类型。
var query = await _db.Users.ToListAsync();
query
是一个用户列表。
var users = query.Select(async u => new
{
FirstName = u.FirstName,
LastName = u.LastName,
IsGeek = await _userManager.IsInRoleAsync(u.Id, "Geek")
});
当您Select
使用async
lambda时,结果是任务序列。因此,要(异步)等待所有这些任务完成,请使用Task.WhenAll
:
var result = await Task.WhenAll(users);
return Ok(result);