Como posso esperar até que o Parallel.ForEach seja concluído

122

Estou usando o TPL no meu projeto atual e usando o Parallel.Foreach para girar muitos threads. A classe Task contém Wait () para aguardar até que a tarefa seja concluída. Assim, como posso esperar que o Parallel.ForEach seja concluído e depois executar as próximas instruções?

VJAI
fonte

Respostas:

192

Você não precisa fazer nada de especial; Parallel.Foreach()esperará até que todas as suas tarefas ramificadas sejam concluídas. No thread de chamada, você pode tratá-lo como uma única instrução síncrona e, por exemplo, envolvê-lo em uma tentativa / captura.

Henk Holterman
fonte
10
"Parallel.Foreach () irá esperar até que todas as suas tarefas ramificadas estejam concluídas", pode ser confundido em alguma situação, como (tarefa assíncrona dentro): Parallel.ForEach (groupedUnreadMessages, async unreadMsgCollection => {/ * works * /});
Bo HU
Aqui está um outras questões em stackoverflow: stackoverflow.com/questions/11564506/...
Bo HU
4
Esta resposta é de 2011, antes de assíncrono / aguardar. Mas, como eu disse, gerar tópicos dentro do ForEach não é uma boa ideia. Nem é uma ação assíncrona. Os links que você postou fornecem boas informações e soluções.
Henk Holterman
1
"threads de desova no ForEach não são uma boa ideia", você pode expandir? Isso é "a menos que você espere antes de retornar"?
Gianthra
16

Você não precisa disso com o Parallel.Foreach: ele executa o foreach apenas em quantos threads houver processadores disponíveis, mas retorna de forma síncrona.

Mais informações podem ser encontradas aqui

Louis Kottmann
fonte