Birincisi çok daha iyi bir seçenektir.
Paralel.ForEach, dahili olarak, Partitioner<T>
koleksiyonunuzu iş öğelerine dağıtmak için a kullanır . Öğe başına bir görev yapmaz, bunun yerine ilgili ek yükü azaltmak için bunu toplu olarak işler.
İkinci seçenek, Task
koleksiyonunuzdaki her öğe için bir tane zamanlayacaktır . Sonuçlar (neredeyse) aynı olsa da, bu özellikle büyük koleksiyonlar için gerekenden çok daha fazla yük getirecek ve genel çalışma sürelerinin daha yavaş olmasına neden olacaktır.
FYI - Kullanılan Partitioner , istenirse Parallel.ForEach için uygun aşırı yükler kullanılarak kontrol edilebilir . Ayrıntılar için bkz . MSDN'deki Özel Bölümleyiciler.
Çalışma zamanında temel fark, ikincisinin eşzamansız davranmasıdır. Bu, Parallel.ForEach kullanılarak şu şekilde çoğaltılabilir:
Task.Factory.StartNew( () => Parallel.ForEach<Item>(items, item => DoSomething(item)));
Bunu yaparak, bölücülerden yararlanmaya devam edersiniz, ancak işlem tamamlanana kadar engellemeyin.