ParallelEnumerable
имеет статического участника AsParallel
. Если я имею IEnumerable<T>
и хочу использовать Parallel.ForEach
делает, которые подразумевают, что я должен всегда использовать AsParallel
?
например, оба из них корректны (все остальное являющееся равным)?
без AsParallel
:
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f));
или с AsParallel
?
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f));
Это зависит от того, что вызывается, это отдельные вопросы.
.AsParallel ()
Распараллеливает перечисление , а не делегирование задач.
Parallel.ForEach
Распараллелил цикл , назначив задачи рабочим потокам для каждого элемента.
Таким образом, если ваше перечисление источников не выигрывает от параллелизма (например, reader.Match (file)
стоит дорого), они равны. На ваш последний вопрос, да , оба они также верны.
Кроме того, есть еще одна конструкция, которую вы можете захотеть рассмотреть, которая немного сокращает ее, по-прежнему получая максимальную пользу от PLINQ:
GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));