Я настроил свой пул потоков следующим образом:
ThreadPool.SetMaxThreads(10000, 10000);
ThreadPool.SetMinThreads(20, 20);
Однако мое приложение начало зависать при большой нагрузке.Казалось, это потому, что рабочие задачи не выполнялись: я использовал ThreadPool.QueueUserWorkItem
для запуска некоторых задач, которые, в свою очередь, использовали тот же метод для постановки в очередь на дальнейшую работу.Это очевидно опасно с ограниченным пулом потоков (ситуация взаимоблокировки), но я использую пул потоков не для того, чтобы ограничивать максимальное количество потоков, а чтобы уменьшить накладные расходы на создание потоков.
Я вижу потенциальную ловушку там, но яполагал, что установка максимум 10000 потоков в пуле будет означать, что если элемент был поставлен в очередь, все потоки были заняты, и в пуле не было 10000 потоков, то был бы создан новый и обработана задача.
Однако я изменил на это:
ThreadPool.SetMaxThreads(10000, 10000);
ThreadPool.SetMinThreads(200, 200);
.. и приложение начало работать.Если это заставило его начать работать, я что-то упускаю из-за того, как / когда пул потоков расширяется от минимального до максимального размера?