Foreach (IEnumerable <T> .AsParallel ()) ile Paralel.


143

Erg, bu iki yöntemi BCL'de Reflector kullanarak bulmaya çalışıyorum, ama onları bulamıyorum. Bu iki parçacık arasındaki fark nedir?

A:

IEnumerable<string> items = ...

Parallel.ForEach(items, item => {
   ...
});

B:

IEnumerable<string> items = ...

foreach (var item in items.AsParallel())
{
   ...
}

Birini diğerinin üzerinde kullanmanın farklı sonuçları var mı? (Her iki örneğin de parantez içindeki gövdelerinde yaptığım her şeyin iş parçacığı için güvenli olduğunu varsayın.)

Yanıtlar:


148

Oldukça farklı bir şey yapıyorlar.

Birincisi anonim temsilci alır ve bu kod üzerinde tüm farklı öğeler için paralel olarak birden çok iş parçacığı çalıştırır.

İkincisi bu senaryoda pek kullanışlı değil. Özetle, birden çok iş parçacığı üzerinde bir sorgu yapmak ve sonucu birleştirmek ve tekrar çağıran iş parçacığına vermek amaçlanmıştır. Bu nedenle, foreach ifadesindeki kod her zaman UI iş parçacığında kalır.

Sadece AsParallel()çağrının sağındaki linq sorgusunda pahalı bir şey yaparsanız mantıklıdır , örneğin:

 var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));

Computefibonacci'de sadece paralel bir foreach yapmanın faydası nedir?
l --''''''---------------- '' '' '' '' '' ''

51

Aradaki fark, B paralel değil. Tek şey AsParallel(), IEnumerableLINQ yöntemlerini kullandığınızda, paralel varyantlarının kullanılması için a'nın etrafına sarılmasıdır. Sarıcı GetEnumerator()(içinde perde arkasında kullanılan foreach) orijinal koleksiyonun sonucunu bile döndürür GetEnumerator().

Eğer yansıtıcı içinde yöntemlere bakmak isterseniz btw, AsParallel()olduğu System.Linq.ParallelEnumerablesınıf System.Coremontaj. Parallel.ForEach()olduğu mscorlibgrubu (ad System.Threading.Tasks).


Ne demek istiyorsun ... Paralel varyantları kullanılıyor ...?
l --''''''---------------- '' '' '' '' '' ''

2
@punctuation Örneğin, yazarken , normal değil .Select()çağırır . ParallelEnumerable.Select()Enumerable.Select()
svick

50

İkinci yöntem, örnekte AsParallel () kullanmanın doğru yolu paralel olmayacaktır.

IEnumerable<string> items = ...

items.AsParallel().ForAll(item =>
{
    //Do parallel stuff here
});

3
Neden sadece foreach yerine forparalel kombinasyonunu forall ile birlikte kullanıyorsunuz?
l --''''''---------------- '' '' '' '' '' ''
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.