पहला बेहतर विकल्प है।
Parallel.ForEach, आंतरिक रूप से, Partitioner<T>
अपने संग्रह को कार्य आइटम में वितरित करने के लिए उपयोग करता है । यह प्रति आइटम एक कार्य नहीं करेगा, बल्कि इसमें शामिल ओवरहेड को कम करने के लिए बैच करेगा।
दूसरा विकल्प Task
आपके संग्रह में प्रति आइटम एकल शेड्यूल करेगा । जबकि परिणाम (लगभग) समान होंगे, यह विशेष रूप से बड़े संग्रह के लिए आवश्यक से कहीं अधिक ओवरहेड का परिचय देगा, और समग्र रनटाइम को धीमा कर देगा।
FYI करें - उपयोग किए गए विभाजन को Parallel.ForEach के लिए उपयुक्त अधिभार का उपयोग करके नियंत्रित किया जा सकता है , यदि ऐसा है तो वांछित। विवरण के लिए, MSDN पर कस्टम पार्टीशनर देखें ।
मुख्य अंतर, रनटाइम पर, दूसरा अतुल्यकालिक कार्य करेगा। इसे Parallel.ForEach का उपयोग करके डुप्लिकेट किया जा सकता है:
Task.Factory.StartNew( () => Parallel.ForEach<Item>(items, item => DoSomething(item)));
ऐसा करने से, आप अभी भी पार्टीशनर्स का लाभ उठाते हैं, लेकिन ऑपरेशन पूरा होने तक ब्लॉक नहीं करते हैं।