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));