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


123

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

Ответы:


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 только в том количестве потоков, сколько есть доступных процессоров, но возвращает синхронно.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.