Yang pertama adalah pilihan yang jauh lebih baik.
Parallel.ForEach, secara internal, menggunakan a Partitioner<T>
untuk mendistribusikan koleksi Anda ke item pekerjaan. Itu tidak akan melakukan satu tugas per item, tetapi batch ini untuk menurunkan overhead yang terlibat.
Opsi kedua akan menjadwalkan satu Task
per item dalam koleksi Anda. Walaupun hasilnya akan (hampir) sama, ini akan menghasilkan overhead yang jauh lebih banyak dari yang diperlukan, terutama untuk koleksi besar, dan menyebabkan runtime keseluruhan menjadi lebih lambat.
FYI - Partisi yang digunakan dapat dikontrol dengan menggunakan overload yang sesuai ke Paralel. Untuk Setiap , jika diinginkan. Untuk detailnya, lihat Pemisah Kustom di MSDN.
Perbedaan utama, pada saat runtime, adalah yang kedua akan bertindak asinkron. Ini dapat diduplikasi menggunakan Paralel. FOREach dengan melakukan:
Task.Factory.StartNew( () => Parallel.ForEach<Item>(items, item => DoSomething(item)));
Dengan melakukan ini, Anda masih mengambil keuntungan dari partisi, tetapi jangan memblokir sampai operasi selesai.