ฉันจะรอจนกว่า ParallelForEach จะเสร็จสมบูรณ์ได้อย่างไร


122

ฉันใช้ TPL ในโปรเจ็กต์ปัจจุบันของฉันและใช้ Parallel.Foreach เพื่อหมุนเธรดจำนวนมาก คลาสงานประกอบด้วย Wait () เพื่อรอจนกว่างานจะเสร็จสมบูรณ์ เช่นนั้นฉันจะรอให้ ParallelForEach เสร็จสมบูรณ์แล้วไปเรียกใช้คำสั่งถัดไปได้อย่างไร

คำตอบ:


193

คุณไม่จำเป็นต้องทำอะไรเป็นพิเศษParallel.Foreach()จะรอจนกว่างานที่แยกย่อยทั้งหมดจะเสร็จสมบูรณ์ จากเธรดการโทรคุณสามารถถือว่าเป็นคำสั่งซิงโครนัสเดียวและเช่นรวมไว้ใน try / catch


10
"Parallel.Foreach () จะรอจนกว่างานที่แยกย่อยทั้งหมดจะเสร็จสมบูรณ์" อาจทำให้สับสนได้ในบางสถานการณ์เช่น (async task inside): ParallelForEach (groupedUnreadMessages, async unreadMsgCollection => {/ * works * /});
Bo HU

นี่คือปัญหาอื่น ๆ ใน stackoverflow: stackoverflow.com/questions/11564506/…
Bo HU

4
คำตอบนี้มาจากปี 2011 ก่อนที่จะ async / await แต่อย่างที่ฉันพูดไปการวางไข่ใน ForEach ไม่ใช่ความคิดที่ดี ไม่เป็นการดำเนินการแบบไม่ซิงค์ ลิงก์ที่คุณโพสต์ให้ข้อมูลและวิธีแก้ปัญหาที่ดี
Henk Holterman

1
"spawning threads ใน ForEach ไม่ใช่ความคิดที่ดี" คุณสามารถขยายได้ไหม นั่นคือ "เว้นแต่คุณจะแน่ใจว่าคุณรอก่อนกลับ"?
Gianthra

16

คุณไม่จำเป็นต้องใช้ Parallel.Foreach: มันดำเนินการ foreach ในเธรดให้มากที่สุดเท่าที่มีโปรเซสเซอร์พร้อมใช้งาน แต่จะส่งคืนแบบซิงโครนัส

สามารถดูข้อมูลเพิ่มเติมได้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.