Менеджер пула потоков гарантирует, что только столько потоков разрешено выполнять, сколько у вас ядер ЦП.Как только один завершает работу, другой, ожидающий в очереди, может выполняться.
Дважды в секунду он переоценивает, что происходит с запущенными потоками.Если они не завершаются, предполагается, что они заблокированы, и позволяет запустить другой ожидающий поток.На типичном двухъядерном процессоре вы сразу получите два потока, третий поток запускается через одну секунду, четвертый поток через 1,5 секунды, и так далее.Исправление Q & D заключается в использовании ThreadPool.SetMinThreads (), но это решение кувалдой.Реальная проблема заключается в том, что ваша программа использует потоки пула потоков для длительных задач.Либо потому, что они выполняют много кода, либо потому, что они блокируют какой-то запрос ввода-вывода.Последний является наиболее распространенным случаем.
Чтобы решить эту проблему, нужно не использовать поток пула потоков для такого блокирующего потока, а вместо этого использовать класс Thread.Не делайте этого, если потоки фактически сжигают циклы процессора, вы все замедляете.Легко сказать, вы увидите 100% загрузки процессора в Taskmgr.exe