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

Максимальные потоки ThreadPool

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

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

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

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

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

4b9b3361

Ответ 2

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

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

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

Ответ 3

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

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

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