Máximo Grado de Paralelismo para AsParalelo ()

Mientras usamos Parallel.ForEach tenemos la opción de definir las opciones de Paralelo y establecer el Grado Máximo de Paralelismo como:

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

Pero mientras hace PLINQ como:

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

No pude encontrar una manera de establecer MaxDegreeOfParallelism . Miré hacia arriba en la red también, pero no encontré nada. Como alguien encontró una manera de evitar esto? Cualquier ayuda es apreciada.

Puede usar ParallelEnumerable.WithDegreeOfParallelism :

Establece el grado de paralelismo a utilizar en una consulta. El grado de paralelismo es el número máximo de tareas que se ejecutan simultáneamente para procesar la consulta.

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

Editar:

@svick proporcionó un excelente en ParallelOptions.MaxDegreeOfParallelism vs PLINQ’s WithDegreeOfPalallelism que enfatiza la diferencia entre los dos:

Los trabajos paralelos que utilizan un concepto debajo de las coberturas que denominamos tareas de replicación. El concepto es que un bucle comenzará con una tarea para procesar el bucle, pero si hay más subprocesos disponibles para ayudar en el procesamiento, se crearán tareas adicionales para ejecutarse en esos subprocesos. Esto permite la minimización del consumo de recursos. Dado esto, sería incorrecto afirmar que ParallelOptions permite la especificación de un DegreeOfParallelism, porque en realidad es un grado máximo : el bucle comienza con un grado de 1, y puede funcionar hasta cualquier máximo que se especifique cuando los recursos estén disponibles.

PLINQ es diferente. Algunos operadores de consultas estándar importantes en PLINQ requieren comunicación entre los subprocesos involucrados en el procesamiento de la consulta, incluidos algunos que dependen de una barrera para permitir que los subprocesos operen en el paso de locking. El diseño de PLINQ requiere que un número específico de subprocesos esté involucrado activamente para que la consulta progrese. Por lo tanto, cuando especifica un DegreeOfParallelism para PLINQ, está especificando el número real de subprocesos que estarán involucrados, en lugar de solo un máximo.

Sí, ciertamente puedes hacer eso. Solo usa el método de extensión WithDegreeOfParallelism

 yourSequence.AsParallel() .WithDegreeOfParallelism(5)//Whatever number as you like .Where(...); 
 .AsParallel() .WithDegreeOfParallelism(n) .Where(x=>)