Problemas de .net Core Parallel.ForEach
Eu mudei para o .net Core para alguns projetos e agora estou tendo um problema com o Parallel.ForEach. No passado, eu costumava ter uma lista de valores de ID que eu usaria para fazer solicitações da Web para obter os dados completos. Seria algo como isto:
Parallel.ForEach(myList, l =>
{
// make web request using l.id
// process the data somehow
});
Bem, no .net Core, todas as solicitações da Web devem ser marcadasawait
o que significa que a ação Parallel.ForEach deve ser marcada comasync
. Mas, marcar uma ação Parallel.ForEach comoasync
significa que temos umvoid async
método que causa problemas. No meu caso particular, isso significa que a resposta retorna ao aplicativoantes todas as solicitações da web no loop paralelo são concluídas, o que é estranho e causa erros.
Pergunta: Quais são as alternativas para usar o Parallel.ForEach aqui?
Uma solução possível que encontrei foi agrupar o loop paralelo dentro de uma tarefa e aguardar a tarefa:
await Task.Run(() => Parallel.ForEach(myList, l =>
{
// stuff here
}));
(encontrado aqui:Parallel.ForEach vs Task.Run e Task.WhenAll)
Mas isso não está funcionando para mim. Quando uso isso, acabo retornando ao aplicativo antes da conclusão do loop.
Outra opção:
var tasks = new List<Task>();
foreach (var l in myList)
{
tasks.Add(Task.Run(async () =>
{
// stuff here
}));
}
await Task.WhenAll(tasks);
Isso parece funcionar, mas essa é a única opção? Parece que o novo .net Core tornou Parallel.ForEach praticamente inútil (pelo menos quando se trata de chamadas da Web aninhadas).
Qualquer assistência / conselho é apreciada.