Требует ли Parallel.ForEach AsParallel () - PullRequest
18 голосов
/ 16 февраля 2010

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

1 Ответ

22 голосов
/ 16 февраля 2010

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

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

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

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

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

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