Макс. Степень Parallelism для AsParallel()

При использовании Parallel.ForEach у нас есть возможность определить параметры Parallel и установить максимальную степень Parallelism как:

Parallel.ForEach(values, new ParallelOptions {MaxDegreeOfParallelism = number}, value = > {
    // Do Work
})

Но при выполнении PLINQ, например:

Tabel.AsEnumberable()
     .AsParallel()
     .Where(//Logic)

Мне не удалось найти способ установить MaxDegreeOfParallelism. Я тоже посмотрел в сети, но ничего не нашел. Как кто-нибудь нашел способ обойти это? Любая помощь приветствуется.

Ответы

Ответ 1

Вы можете использовать ParallelEnumerable.WithDegreeOfParallelism:

Устанавливает степень parallelism для использования в запросе. Степень parallelism - максимальное количество одновременно выполняющих задач, которые будет использоваться для обработки запроса.

var result = Tabel.AsEnumberable()
                  .AsParallel()
                  .WithDegreeOfParallelism(number)
                  .Where(/* predicate */);

Edit:

@svick предоставил отличный ParallelOptions.MaxDegreeOfParallelism vs PLINQs WithDegreeOfParallelism, который подчеркивает разницу между ними:

Параллельные работы, использующие концепцию под крышкой, которую мы называем реплицирующими задачами. Концепция состоит в том, что цикл будет запускаться с одной задачей для обработки цикла, но если в процессе обработки будет доступно больше потоков, для этих потоков будут созданы дополнительные задачи. Это позволяет минимизировать потребление ресурсов. Учитывая это, было бы неточно утверждать, что ParallelOptions позволяет специфицировать DegreeOfParallelism, поскольку его действительно максимальная степень: цикл начинается со степени 1 и может пробиваться до любого максимума которые указаны как ресурсы становятся доступными.

PLINQ отличается. Некоторые важные стандартные операторы запросов в PLINQ требуют связи между потоками, участвующими в обработке запроса, включая некоторые, которые полагаются на барьер, чтобы потоки могли работать в режиме блокировки. Для проектирования PLINQ требуется, чтобы определенное количество потоков было активно вовлечено в запрос для достижения какого-либо прогресса. Таким образом, когда вы указываете DegreeOfParallelism для PLINQ, вы указываете фактическое количество потоков, которые будут задействованы, а не только максимум.

Ответ 2

Да, вы можете это сделать. Вы просто используете метод WithDegreeOfParallelism

yourSequence.AsParallel()
    .WithDegreeOfParallelism(5)//Whatever number as you like
    .Where(...);

Ответ 3

<IEnumerable>.AsParallel()
.WithDegreeOfParallelism(n)
.Where(x=>)