如何让异步lambda等待?

时间:2019-12-15 12:42:33

标签: c# .net asynchronous

我具有以下功能:

public async Task<List<UserViewModel>> Get(string role, string nameText, int offset, int number) {
    List<User> users = new List<User>();
    if (role != "") {
    new List<User>(await userManager.GetUsersForClaimAsync(new System.Security.Claims.Claim("role", role)));

    }

    List<Task<UserViewModel>> data = users
    .Skip(offset)
    .Take(number)
    .Select(async (user) => {
        return await identityUserToUserViewModel(user); ;
    }).ToList();


    return data;
}

调用

async Task<UserViewModel> identityUserToUserViewModel(User user) {
    var principal = await userManager.GetClaimsAsync(user);
    return new UserViewModel()
    {
        Email = user.Email,
        PhoneNumber = user.PhoneNumber,
        Location = locationRepository.GetForUser(user.Id),
        Name = user.Name,
        Role = principal.Where(Claim => Claim.Type == "role").ToList().FirstOrDefault().Value,
        sub = user.Id
    };
}

但是,此函数给出的错误为 Cannot implicitly convert type 'System.Collections.Generic.List<System.Threading.Tasks.Task<Models.ViewModel.UserViewModel>>' to 'System.Collections.Generic.List<Models.ViewModel.UserViewModel>'

我知道异步lambda会将其转换回任务,但我不知道如何-不会发生这种情况。

2 个答案:

答案 0 :(得分:1)

.Select(async (user) => {
    return await identityUserToUserViewModel(user);
})

因为制作async实际上意味着结果被包裹在Task中,所以实际上具有与以下内容相同的结果:

.Select((user) => {
    return identityUserToUserViewModel(user);
})

因此,该调用的结果为IEnumerable<Task<UserViewModel>>。因此,将其转换为列表将为您提供任务列表,而不是UserViewModels列表。

如果您现在想等待 all 所有这些任务并只返回视图模型列表,则可以使用Task.WhenAll。它将等待传递的所有任务,并幸运地返回所有任务结果的数组:

IEnumerable<Task<UserViewModel>> dataTasks = users
    .Skip(offset)
    .Take(number)
    .Select(identityUserToUserViewModel);

UserViewModel[] data = Task.WhenAll(dataTasks);

return data;

答案 1 :(得分:0)

由于以下代码,每次通话都会返回Task<UserViewModel>

.Select(async (user) => {
    return await identityUserToUserViewModel(user);

您可以用await Task.WhenAll(...)包装LINQ表达式,这将返回一个UserViewModel数组,该数组可以转换为List<UserViewModel>