Как я могу ограничить Parallel.ForEach? - PullRequest
266 голосов
/ 15 февраля 2012

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

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

Демо-код:

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

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

Ответы [ 4 ]

508 голосов
/ 15 февраля 2012

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

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

MSDN: Parallel.ForEach

MSDN: ParallelOptions.MaxDegreeOfParallelism

37 голосов
/ 15 февраля 2012

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

Parallel.ForEach(listOfwebpages, new ParallelOptions{MaxDegreeOfParallelism=2}, webpage => {Download(webpage);});     
21 голосов
/ 15 февраля 2012

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

9 голосов
/ 16 августа 2016

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

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