Как мне дождаться завершения Parallel.ForEach

123

Я использую TPL в своем текущем проекте и использую Parallel.Foreach для вращения множества потоков. Класс Task содержит Wait (), чтобы дождаться завершения задачи. Как я могу дождаться завершения Parallel.ForEach, а затем перейти к выполнению следующих операторов?

VJAI
источник

Ответы:

193

Ничего особенного делать не надо, Parallel.Foreach()подождем, пока будут выполнены все его разветвленные задачи. Из вызывающего потока вы можете рассматривать его как один синхронный оператор и, например, заключить его в команду try / catch.

Хенк Холтерман
источник
10
«Parallel.Foreach () будет ждать, пока все его разветвленные задачи не будут завершены», это может быть запутано в некоторых ситуациях, например (асинхронная задача внутри): Parallel.ForEach (groupedUnreadMessages, async unreadMsgCollection => {/ * работает * /});
Bo HU
вот другие проблемы в stackoverflow: stackoverflow.com/questions/11564506/…
Bo HU
4
Это ответ с 2011 года, до async / await. Но, как я уже сказал, создание потоков внутри ForEach - не лучшая идея. Также нет асинхронного действия. Размещенные вами ссылки предоставляют полезную информацию и решения.
Хенк Холтерман
1
«создание потоков внутри ForEach - не лучшая идея», можете ли вы расширить? Это «если только вы не дождетесь перед возвращением»?
Gianthra
16

Вам это не нужно с Parallel.Foreach: он выполняет foreach только в том количестве потоков, сколько есть доступных процессоров, но возвращает синхронно.

Более подробную информацию можно найти здесь

Луи Коттманн
источник