Как я могу ограничить Parallel.ForEach?

У меня есть асинхронный цикл Parallel.ForEach(), с помощью которого я загружаю некоторые веб-страницы. Моя пропускная способность ограничена, поэтому я могу загружать только x страниц за раз, но Parallel.ForEach выполняет весь список желаемых веб-страниц.

Есть ли способ ограничить число потоков или любой другой ограничитель во время работы Parallel.ForEach?

Демо-код:

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

Реальная задача не имеет ничего общего с веб-страницами, поэтому креативные решения для сканирования в Интернете не помогут.

Ответ 1

Вы можете указать MaxDegreeOfParallelism в параметре ParallelOptions:

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

MSDN: Parallel.ForEach

MSDN: ParallelOptions.MaxDegreeOfParallelism

Ответ 2

Вы можете использовать ParallelOptions и установить MaxDegreeOfParallelism для ограничения количества одновременных потоков:

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

Ответ 3

Используйте другую перегрузку Parallel.Foreach, которая принимает экземпляр ParallelOptions и устанавливает MaxDegreeOfParallelism, чтобы ограничить количество экземпляров параллельно.

Ответ 4

И для пользователей VB.net(синтаксис странный и трудно найти)...

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