2012-02-15 16 views
218

Tengo un bucle asíncrono Parallel.ForEach() con el que descargo algunas páginas web. Mi ancho de banda es limitado, así que puedo descargar solo x páginas por vez, pero Parallel.ForEach ejecuta toda la lista de páginas web deseadas.¿Cómo puedo limitar Parallel.ForEach?

¿Hay alguna manera de limitar el número de subprocesos o cualquier otro limitador mientras se ejecuta Parallel.ForEach?

código de demostración:

Parallel.ForEach(listOfWebpages, webpage => { 
    Download(webpage); 
}); 

La verdadera tarea no tiene nada que ver con las páginas web, por lo que se arrastra web soluciones creativas no ayudará.

+5

Veo que está ejecutando un Parallel.ForEach() en una lista - Yo también gusta vivir peligrosamente. – jKlaus

+0

@jKlaus Si la lista no se modifica, p. es solo un conjunto de URL, realmente no puedo ver el problema? – Shiv

+0

@Shiv, dado el tiempo suficiente ... Contar el número de ejecuciones y compararlo con el recuento de la lista. – jKlaus

Respuesta

394

Puede especificar una MaxDegreeOfParallelism en un parámetro ParallelOptions:

Parallel.ForEach(
    listOfWebpages, 
    new ParallelOptions { MaxDegreeOfParallelism = 4 }, 
    webpage => { Download(webpage); } 
); 

MSDN: Parallel.ForEach

MSDN: ParallelOptions.MaxDegreeOfParallelism

+27

Puede que no se aplique a este caso en particular, pero pensé que lo tiraría en caso de que alguien se pregunta a través de esto y lo encuentra útil. Aquí estoy utilizando el 75% (redondeado) de la cuenta del procesador. 'var = new opta ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32 (Math.Ceiling ((Environment.ProcessorCount * 0,75) * 1.0));} ' – jKlaus

+2

sólo para salvar cualquier otra persona tienen que mirar hacia arriba en la documentación , pasar un valor de '-1' es lo mismo que no especificarlo en absoluto: _" Si [el valor] es -1, no hay límite en el número de operaciones simultáneas "_ – stuartd

+0

No me queda claro desde documentación - si establecer MaxDegreeOfParallelism en 4 (por ejemplo) significa que habrá 4 hilos cada uno ejecutando 1/4 de las iteraciones de bucle (una ronda de 4 hilos enviados), o cada hilo todavía hace una iteración de bucle y solo estamos ¿limitando cuántos corren en paralelo? – Hashman

30

Puede utilizar ParallelOptions y establecer MaxDegreeOfParallelism para limitar el número de hilos concurrentes:

Parallel.ForEach(listOfwebpages, new ParallelOptions{MaxDegreeOfParallelism=2}, webpage => {Download(webpage);});  
18

Utilice otra sobrecarga de Parallel.Foreach que tome una instancia de ParallelOptions y establezca MaxDegreeOfParallelism para limitar cuántas instancias se ejecutan en paralelo.

6

Y para los usuarios VB.net (sintaxis es raro y difícil de encontrar) ...

Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage) 
......end sub) 
+0

tan raro y aparentemente indocumentado - ¡gracias! –

Cuestiones relacionadas