Eu tenho uma lista de tarefas que criei assim:
public async Task<IList<Foo>> GetFoosAndDoSomethingAsync()
{
var foos = await GetFoosAsync();
var tasks = foos.Select(async foo => await DoSomethingAsync(foo)).ToList();
...
}
Ao usar .ToList()
, todas as tarefas devem ser iniciadas. Agora quero aguardar sua finalização e retornar os resultados.
Isso funciona no ...
bloco acima :
var list = new List<Foo>();
foreach (var task in tasks)
list.Add(await task);
return list;
Ele faz o que eu quero, mas parece um tanto desajeitado. Prefiro escrever algo mais simples como este:
return tasks.Select(async task => await task).ToList();
... mas isso não compila. o que estou perdendo? Ou simplesmente não é possível expressar as coisas dessa maneira?
DoSomethingAsync(foo)
série para cada foo ou este é um candidato para Parallel.ForEach <Foo> ?