Ответ 1
Я считаю, что эта статья о ThreadPool concurrency должна содержать некоторые подсказки.
Задачи, созданные методами Parallel, в конечном итоге будут выполнены ThreadPool. Идеальное количество потоков для ThreadPool для использования зависит от типа выполняемых задач. Если задачи много блокируются и не имеют большого разногласия, большее число потоков приведет к большей пропускной способности. Для задач с небольшим количеством блокировок и высокой конкуренцией для ограниченных ресурсов меньшее число потоков приведет к большей пропускной способности.
Из-за этого свойства ThreadPool в .NET 4 реализует алгоритм "восхождения на холм", где он настраивает количество потоков, которые ThreadPool запускает и реагирует на основе измеренной пропускной способности.
Итак, вы можете проверить, действительно ли фактическая пропускная способность работы уменьшается с уменьшенным числом потоков. Также возможно, что по мере того, как ваше приложение запускает его все больше и больше на дисковых операциях, а потоки закрываются просто из-за неиспользования.
Что касается того, чтобы заставить ThreadPool использовать определенное количество потоков, я не думаю, что это возможно. Там ThreadPool.SetMinThreads, но это никогда не срабатывало для меня. Обычно .NET будет просто игнорировать эти значения и использовать любое количество потоков, которые он хочет.