如何在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);
_usermanager
是继承自AspNet.Identity的UserManager
。 - dafriskymonkeyawait
会改善情况?至于“永远不返回”,如果调用者正在等待,那么方法中唯一可能导致其卡住的两个地方是对ToListAsync()
和Ok()
的调用。你的第一步是在调试器中观察执行过程,看看是哪个地方出了问题,然后跟踪代码到达该点的确切位置(即实际上没有返回的调用正在等待什么)。 - Peter Duniho