如何在lambda中使用async / await

时间:2014-11-29 16:16:39

标签: c# linq lambda async-await asp.net-web-api

如何在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是应用的DbContextUserManager

感谢。

更新

这个等效的代码永远不会失败(但它不是优雅的:():

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);

1 个答案:

答案 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);