ThreadPool max темы - PullRequest
       7

ThreadPool max темы

25 голосов
/ 14 мая 2011

У меня возникли проблемы с .NET ThreadPool (.NET 4).

Я читал, что по умолчанию .NET имеет ограничение в 25 потоков на процессор, но согласно сообщениям на форуме в SO и других местах, я могу увеличить ограничение с помощью приведенного ниже кода.

void SetThreads(int threads)
{
    ThreadPool.SetMaxThreads(threads, threads);
    ThreadPool.SetMinThreads(threads, threads);
}

Однако, когда я устанавливаю вышеупомянутое значение на произвольно большое число, например, 2000, и очередь ~ 1000 элементов, у меня все еще остается только ~ 33 потока (.NET CLR занимает ~ 5 потоков), и ThreadPool.GetAvailableThreads() возвращает Осталось 1971 тем.

Почему код выше не работает?

Ответы [ 3 ]

79 голосов
/ 14 мая 2011

Во-первых, ваше «знание» значений по умолчанию неверно.Предел 25 потоков на процессор вернулся из .NET 1.1.Он был увеличен в .NET 2, и теперь :

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

Однако, есть кое-что еще: пул потоков не немедленно создает новые потоки во всех ситуациях.Для того, чтобы справляться с пакетами небольших задач, он ограничивает скорость создания новых потоков.IIRC, он будет создавать один поток каждые 0,5 секунды, если есть нерешенные задачи, вплоть до максимального количества потоков.Я не могу сразу увидеть эту цифру, хотя она может измениться.Я сильно подозреваю, что это то, что вы видите.Попробуйте поставить в очередь много элементов, а затем отслеживать количество потоков с течением времени.

8 голосов
/ 14 мая 2011

От MSDN :

Когда спрос низок, фактическое количество потоков пула потоков может упасть ниже минимальных значений.

Прочтите также: Шаблоны для параллельного программирования: понимание и применение параллельных шаблонов в .NET Framework 4

1 голос
/ 14 мая 2011

Сначала проверьте эту ссылку , особенно это замечание:

Если общеязыковая среда выполнения размещается, например, через Интернет Информационные службы (IIS) или SQL Server, хост может ограничить или предотвратить изменение размера пула потоков.

Затем вы должны проверить возвращаемое значение метода ThreadPool.SetMaxThreads(threads, threads). Может быть, он возвращает false?

...