Erg, saya mencoba menemukan dua metode ini di BCL menggunakan Reflector, tetapi tidak dapat menemukannya. Apa perbedaan antara kedua cuplikan ini?
SEBUAH:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
B:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
Apakah ada konsekuensi yang berbeda dari penggunaan satu di atas yang lain? (Asumsikan bahwa apa pun yang saya lakukan di badan kurung dari kedua contoh adalah thread aman.)
sumber
Perbedaannya adalah, B tidak paralel. Satu-satunya hal yang
AsParallel()
dilakukan adalah membungkusnyaIEnumerable
, sehingga ketika Anda menggunakan metode LINQ, varian paralelnya digunakan. PembungkusGetEnumerator()
(yang digunakan di belakang layar diforeach
) bahkan mengembalikan hasil koleksi asliGetEnumerator()
.BTW, jika Anda ingin melihat metode di Reflector,
AsParallel()
ada diSystem.Linq.ParallelEnumerable
kelas diSystem.Core
majelis.Parallel.ForEach()
ada dimscorlib
majelis (namespaceSystem.Threading.Tasks
).sumber
.Select()
, ia memanggilParallelEnumerable.Select()
dan bukan yang normalEnumerable.Select()
.Metode kedua tidak akan paralel dengan cara yang benar untuk menggunakan AsParallel () pada contoh Anda
sumber