Эрг, я пытаюсь найти эти два метода в BCL, используя Reflector, но не могу их найти. В чем разница между этими двумя фрагментами?
A:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
B:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
Существуют ли различные последствия использования одного над другим? (Предположим, что все, что я делаю в скобках в обоих примерах, безопасно для потоков.)
источник
Разница в том, что B не параллелен. Единственное, что
AsParallel()
нужно сделать, - это обернуть вокруг негоIEnumerable
, так что при использовании методов LINQ используются их параллельные варианты. ОболочкаGetEnumerator()
(которая используется за кулисами вforeach
) даже возвращает результат оригинальной коллекцииGetEnumerator()
.Кстати, если вы хотите посмотреть на методы в Reflector,
AsParallel()
находится вSystem.Linq.ParallelEnumerable
классе вSystem.Core
сборке.Parallel.ForEach()
находится вmscorlib
сборке (пространстве именSystem.Threading.Tasks
).источник
.Select()
, звонитParallelEnumerable.Select()
и не нормальноEnumerable.Select()
.Второй метод не будет параллельным, правильный способ использования AsParallel () в вашем примере будет
источник