Як я можу зачекати, поки паралель.ForEach завершиться


122

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

Відповіді:


193

Вам не потрібно робити нічого особливого, Parallel.Foreach()будете чекати, поки всі його розгалужені завдання будуть виконані. У потоці виклику ви можете розглядати це як єдиний синхронний вислів і, наприклад, загортати його всередині спробувати.


10
"Parallel.Foreach () буде чекати, поки всі його розгалужені завдання будуть виконані", його можна переплутати в якійсь ситуації, наприклад (завдання асинхронізації всередині): Parallel.ForEach (groupedUnreadMessages, async undeadMsgCollection => {/ * працює * /});
Bo HU

ось інші питання в stackoverflow: stackoverflow.com/questions/11564506/…
Бо HU

4
Ця відповідь є з 2011 року, перш ніж асинхронізувати / очікувати. Але, як я вже говорив, нерестувати нитки всередині ForEach - це не дуже гарна ідея. Не є асинхронною дією. Посилання, які ви розмістили, надають хорошу інформацію та рішення.
Хенк Холтерман

1
"нерестові нитки всередині ForEach - це не дуже гарна ідея". Це "якщо ви не переконайтеся, що чекаєте перед поверненням"?
Gianthra

16

Вам це не потрібно з Parallel.Foreach: він виконує лише foreach у стільки потоків, скільки доступних процесорів, але він повертається синхронно.

Більше інформації можна знайти тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.