Parallel.ForEach() vs. foreach(IEnumerable<T>.AsParallel())

Próbuję znaleźć te dwie metody w BCL przy użyciu reflector, ale nie mogę ich zlokalizować. Jaka jest różnica między nimi?

1:

IEnumerable<string> items = ...

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

2:

IEnumerable<string> items = ...

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

Czy istnieją różne konsekwencje używania jednego nad drugim? (Załóżmy, że wszystko, co robię w nawiasach kwadratowych obu przykładów, jest bezpieczne dla wątków).

1 odpowiedź

Robią coś zupełnie innego. Pierwszy pobiera anonimowego delegata i równolegle uruchamia wiele wątków dla tego kodu dla wszystkich różnych elementów. Drugi niezbyt przydatny w tym scenariuszu. W skrócie, ma on na celu wykonanie zapytania dotyczącego wielu wątków, połączenie wyniku i przekazanie go ponownie wątkowi wywołującemu. Tak więc kod w instrukcji foreach pozostaje zawsze w wątku interfejsu użytkownika.

Ma to sens tylko wtedy, gdy wykonasz coś kosztownego w zapytaniu linq po prawej stronie wywołania AsParallel (), na przykład:

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

Twoja odpowiedź

Zaloguj się aby odpowiedzieć.

Operiada

Operiada to polskojęzyczne forum informatyczne działające na zasadzie pytań i odpowiedzi.

Obserwowane tagi

Zaloguj się aby obserwować tagi.