Gostaria de lidar com uma coleção em paralelo, mas estou tendo problemas para implementá-la e, portanto, espero por alguma ajuda.
O problema surge se eu quiser chamar um método marcado como assíncrono em C #, dentro do lambda do loop paralelo. Por exemplo:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
// some pre stuff
var response = await GetData(item);
bag.Add(response);
// some post stuff
}
var count = bag.Count;
O problema ocorre com a contagem sendo 0, porque todos os threads criados são efetivamente apenas threads de segundo plano e a Parallel.ForEach
chamada não espera pela conclusão. Se eu remover a palavra-chave assíncrona, o método será assim:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
// some pre stuff
var responseTask = await GetData(item);
responseTask.Wait();
var response = responseTask.Result;
bag.Add(response);
// some post stuff
}
var count = bag.Count;
Funciona, mas desativa completamente a esperteza esperada e eu tenho que fazer um tratamento manual de exceções .. (Removido por questões de brevidade).
Como posso implementar um Parallel.ForEach
loop, que usa a palavra-chave wait dentro do lambda? É possível?
O protótipo do método Parallel.ForEach usa um Action<T>
parâmetro as, mas quero que ele aguarde minha lambda assíncrona.
await
doawait GetData(item)
seu segundo bloco de código, pois isso produziria um erro de compilação como está.