Eu tenho um loop assíncrono Parallel.ForEach () com o qual baixo algumas páginas da web. Minha largura de banda é limitada para que eu possa baixar apenas x páginas por vez, mas o Parallel.ForEach executa uma lista completa de páginas da web desejadas.
Existe uma maneira de limitar o número de threads ou qualquer outro limitador durante a execução do Parallel.ForEach?
Código de demonstração:
Parallel.ForEach(listOfWebpages, webpage => {
Download(webpage);
});
A tarefa real não tem nada a ver com páginas da Web, portanto, soluções criativas de rastreamento da Web não ajudarão.
c#
.net
asynchronous
parallel.foreach
eugeneK
fonte
fonte
Respostas:
Você pode especificar a
MaxDegreeOfParallelism
em umParallelOptions
parâmetro:MSDN: Parallel.ForEach
MSDN: ParallelOptions.MaxDegreeOfParallelism
fonte
var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 1.0)) };
-1
igual a não especificá-lo: "Se [o valor] for -1, não há limite para o número de operações em execução simultânea"var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 2.0)) };
. Link para threads vs núcleos - askubuntu.com/questions/668538/…Você pode usar ParallelOptions e configurar MaxDegreeOfParallelism para limitar o número de threads simultâneos:
fonte
Use outra sobrecarga
Parallel.Foreach
que leva umaParallelOptions
instância e definaMaxDegreeOfParallelism
para limitar quantas instâncias são executadas em paralelo.fonte
E para os usuários do VB.net (a sintaxe é estranha e difícil de encontrar) ...
fonte