Подтвердить что ты не робот

Сколько потоков создаст Parallel.For(Foreach)? По умолчанию MaxDegreeOfParallelism?

Я хочу знать, сколько потоков будет использовано при запуске цикла Parallel.For/ForEach.

Я обнаружил, что его можно изменить с помощью опции MaxDegreeOfParallelism.

Справка MaxDegreeOfParallelism в MSDN говорит (ссылка):

По умолчанию For и ForEach будут использовать, однако, много потоков, базовый планировщик обеспечивает, поэтому изменение MaxDegreeOfParallelism от значение по умолчанию ограничивает количество одновременных задач.

Но я не знаю, сколько предоставляет потоковый планировщик.

Как я могу узнать это?

Я мог бы протестировать его с циклом с прогонами 9999999, однако этот тест покажет мне номер, но не правило, определяющее это число.

Изменить/добавить позже:

Я googled для "sheduler max concurrency", и я нашел (в MSDN - ссылка), что класс TashSheduler имеет свойство MaximumConcurrencyLevel и

Возвращает целое число, которое представляет максимальный уровень concurrency. Планировщик по умолчанию возвращает Int32.MaxValue.

Этот класс TaskSheduler используется как "базовый планировщик" для этих параллельных циклов?

4b9b3361

Ответ 1

Согласно MSDN:

Планировщик по умолчанию для параллельной библиотеки задач и PLINQ использует .NET Framework ThreadPool для очереди и выполнения работы. В .NET Framework 4 ThreadPool использует информацию, предоставляемую типом System.Threading.Tasks.Task, чтобы эффективно поддерживать мелкозернистые parallelism (краткосрочные единицы работы), которые часто представляют собой параллельные задачи и запросы.

Посмотрев документацию ThreadPool, он говорит:

Существует один пул потоков для каждого процесса. Начиная с .NET Framework 4 размер пула потоков для процесса зависит от нескольких факторов, таких как размер виртуального адресного пространства. Процесс может вызывать метод GetMaxThreads для определения количества потоков. Количество потоков в пуле потоков может быть изменено с помощью метода SetMaxThreads.