Параллельный .ForEach против AsParallel(). ForAll

У меня есть огромная коллекция, которую я хотел бы обрабатывать каждый из объектов параллельно. Выполнение того же синхронно обычно включает простой "foreach".

Просто интересно, что использовать в моем сценарии, то есть либо Parallel.ForEach, либо MyCollection.AsParallel(). ForAll().

Можете ли вы рассказать мне о преимуществах использования одного и другого.

Ответ 1

Как я вижу это, если все, что вы хотите сделать, это распараллелить foreach, вы должны использовать его параллельную версию, которая Parallel.ForEach().

ParallelEnumerable.ForAll() предназначен для конкретного случая, когда у вас есть запрос LINQ, за которым следует foreach, и вы хотите распараллелить их оба. Итак, что вы делаете, так это то, что вы распараллеливаете запрос LINQ, добавляя AsParallel(), а затем вы распараллеливаете foreach, изменяя его на ForAll().

Ответ 2

Время и выиграть победителя.

Я обнаружил, что Parallel.ForEach лучше работает в самых восхитительно параллельных сценариях. Казалось бы, он использует более совершенную модель балансировки работы. PLINQ в первую очередь направлен на параллельные запросы.

Ответ 3

Мои 2 цента:

С помощью ForAll вы можете указать желаемый уровень parallelism с помощью метода расширения WithDegreeOfParallelism.

С ForEach вы можете ограничить максимальный уровень.

В принципе, вы можете заставить ForAll использовать больше потоков.

Ответ 4

У вас есть возможность заказать элементы с помощью AsParallel(). AsOrdered(). Заказ в Parallel.ForEach не из коробки, нам нужно это сделать.