Подтвердить что ты не робот

Требует ли Parallel.ForEach AsParallel()

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

Ответ 1

Это зависит от того, что называется, они являются отдельными проблемами.

.AsParallel() Параллелирует перечисление не делегирование задач.

Parallel.ForEach Параллельно цикл, назначая задачи рабочим потокам для каждого элемента.

Таким образом, если ваше перечисление источника не становится параллельным (например, reader.Match(file) дорого), они равны. К вашему последнему вопросу, да, оба правильны.

Кроме того, есть еще одна конструкция, которую вы можете захотеть посмотреть, что немного сокращает ее, все еще получая максимальную выгоду от PLINQ:

GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));