Ответ 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, вы указываете фактическое количество потоков, которые будут задействованы, а не только максимум.