如何在lambda中使用async / await

问题描述 投票:2回答:1

如何在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_usermanagerDbContextUserManagerfor应用程序。

谢谢。

更新:

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

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);
c# linq lambda async-await asp.net-web-api
1个回答
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 lambda async时,结果是一系列任务。因此,要(异步)等待所有这些任务完成,请使用Task.WhenAll

var result = await Task.WhenAll(users);
return Ok(result);
© www.soinside.com 2019 - 2024. All rights reserved.