If we want to use a method that’s marked as async
inside a lambda expression, we have to split it in 2 steps:
- task declaration
- (async/await) task execution
example 1
var adminUserTask = users
.Where(user => "admin".Equals(user.type.ToLower()))
.Select(async user => { return await ProcessAdmin(user);});
List<UserResults> results = (await Task.WhenAll(adminUserTask)).ToList();
example 2
// task declaration
var mapTask = animals.Select(Map).ToList();
// task execution
var animalsMapped = (await Task.WhenAll(mapTask)).ToList();
// mapping method
private async Task<Animal> Map(Animal animal)
{
// ... do whatever mapping is needed
}
example 3
private async Task<List<AnimalDTO>> MapAnimalsToDto(List<Animal> animals)
{
var dtos = await Task.WhenAll(animals.Select(a => MapSingleAnimal(a)));
return dtos.ToList();
}
// method signature
private async Task<AnimalDTO> MapSingleAnimal(Animal animal);