Erg, próbuję znaleźć te dwie metody w BCL przy użyciu reflektora, ale nie mogę ich zlokalizować. Jaka jest różnica między tymi dwoma fragmentami?
ZA:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
B:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
Czy istnieją różne konsekwencje używania jednego względem drugiego? (Załóżmy, że wszystko, co robię w nawiasach kwadratowych obu przykładów, jest bezpieczne dla wątków).
źródło
Różnica polega na tym, że B nie jest równoległe. Jedyną rzeczą
AsParallel()
jest to, że zawija się wokół aIEnumerable
, więc gdy używasz metod LINQ, używane są ich równoległe warianty. OpakowanieGetEnumerator()
(które jest używane za kulisami wforeach
) zwraca nawet wynik oryginalnej kolekcjiGetEnumerator()
.BTW, jeśli chcesz spojrzeć na metody w Reflector,
AsParallel()
znajduje się wSystem.Linq.ParallelEnumerable
klasie wSystem.Core
zestawie.Parallel.ForEach()
znajduje się wmscorlib
zestawie (przestrzeni nazwSystem.Threading.Tasks
).źródło
.Select()
, wywołuje,ParallelEnumerable.Select()
a nie normalneEnumerable.Select()
.Druga metoda nie będzie równoległa do prawidłowego sposobu użycia AsParallel () w twoim przykładzie
źródło