Làm thế nào tôi có thể đợi cho đến khi Parallel.ForEach hoàn thành


122

Tôi đang sử dụng TPL trong dự án hiện tại của mình và sử dụng Parallel.Foreach để quay nhiều luồng. Lớp Nhiệm vụ chứa Wait () để đợi cho đến khi nhiệm vụ được hoàn thành. Như vậy, làm cách nào tôi có thể đợi Parallel.ForEach hoàn thành và sau đó bắt đầu thực hiện các câu lệnh tiếp theo?

Câu trả lời:


193

Bạn không phải làm bất cứ điều gì đặc biệt, Parallel.Foreach()sẽ đợi cho đến khi tất cả các nhiệm vụ nhánh của nó hoàn thành. Từ luồng đang gọi, bạn có thể coi nó như một câu lệnh đồng bộ và ví dụ như bọc nó bên trong một try / catch.


10
"Parallel.Foreach () sẽ đợi cho đến khi tất cả các tác vụ được phân nhánh của nó hoàn tất", nó có thể bị nhầm lẫn trong một số trường hợp, như (tác vụ không đồng bộ bên trong): Parallel.ForEach (groupedUnreadMessages, async unreadMsgCollection => {/ * works * /});
Bo HU

đây là một vấn đề khác trong stackoverflow: stackoverflow.com/questions/11564506/…
Bo HU

4
Câu trả lời này là từ năm 2011, trước khi async / await. Nhưng như tôi đã nói, tạo các chuỗi bên trong ForEach không phải là một ý kiến ​​hay. Không phải là một Hành động không đồng bộ. Các liên kết bạn đã đăng cung cấp thông tin và giải pháp tốt.
Henk Holterman

1
"tạo ra các chủ đề bên trong ForEach không phải là một ý tưởng hay", bạn có thể mở rộng không? Đó có phải là "trừ khi bạn chắc chắn rằng bạn đã đợi trước khi trở lại"?
Gianthra

16

Bạn không cần điều đó với Parallel.Foreach: nó chỉ thực thi foreach trong càng nhiều luồng khi có sẵn bộ xử lý, nhưng nó trả về đồng bộ.

Thông tin thêm có thể được tìm thấy tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.