У меня есть асинхронный цикл Parallel.ForEach (), с помощью которого я загружаю некоторые веб-страницы. Моя пропускная способность ограничена, поэтому я могу загружать только x страниц за раз, но Parallel.ForEach выполняет весь список нужных веб-страниц.
Есть ли способ ограничить номер потока или любой другой ограничитель при запуске Parallel.ForEach?
Демо-код:
Parallel.ForEach(listOfWebpages, webpage => {
Download(webpage);
});
Настоящая задача не имеет ничего общего с веб-страницами, поэтому креативные решения для сканирования веб-страниц не помогут.
c#
.net
asynchronous
parallel.foreach
eugeneK
источник
источник
Ответы:
Вы можете указать
MaxDegreeOfParallelism
вParallelOptions
параметре:MSDN: Parallel.ForEach
MSDN: ParallelOptions.MaxDegreeOfParallelism
источник
var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 1.0)) };
-1
аналогична тому, что вообще его не указывается: «Если [значение] равно -1, количество одновременно выполняемых операций не ограничено»var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 2.0)) };
. Ссылка на темы против ядер - askubuntu.com/questions/668538/…Вы можете использовать ParallelOptions и установить MaxDegreeOfParallelism, чтобы ограничить количество одновременных потоков:
источник
Используйте другую перегрузку,
Parallel.Foreach
которая принимаетParallelOptions
экземпляр, и установитеMaxDegreeOfParallelism
для ограничения количества экземпляров, выполняемых параллельно.источник
И для пользователей VB.net (синтаксис странный и трудно найти) ...
источник