Tengo un bucle asíncrono Parallel.ForEach () con el que descargo algunas páginas web. Mi ancho de banda es limitado, por lo que puedo descargar solo x páginas por vez, pero Parallel.ForEach ejecuta una lista completa de las páginas web deseadas.
¿Hay alguna manera de limitar el número de hilos o cualquier otro limitador mientras se ejecuta Parallel.ForEach?
Código de demostración:
Parallel.ForEach(listOfWebpages, webpage => {
Download(webpage);
});
La tarea real no tiene nada que ver con las páginas web, por lo que las soluciones creativas de rastreo web no ayudarán.
c#
.net
asynchronous
parallel.foreach
eugeneK
fuente
fuente
Respuestas:
Puede especificar a
MaxDegreeOfParallelism
en unParallelOptions
parámetro:MSDN: Parallel.ForEach
MSDN: ParallelOptions.MaxDegreeOfParallelism
fuente
var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 1.0)) };
-1
es lo mismo que no especificarlo: "Si [el valor] es -1, no hay límite en el número de operaciones que se ejecutan simultáneamente".var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 2.0)) };
. Enlace a hilos vs núcleos - askubuntu.com/questions/668538/…Puede usar ParallelOptions y establecer MaxDegreeOfParallelism para limitar el número de hilos concurrentes:
fuente
Use otra sobrecarga de
Parallel.Foreach
eso toma unaParallelOptions
instancia y configúreloMaxDegreeOfParallelism
para limitar cuántas instancias se ejecutan en paralelo.fuente
Y para los usuarios de VB.net (la sintaxis es extraña y difícil de encontrar) ...
fuente