Интернет заполнен рекомендациями: "если у вас много небольших независимых задач, которые можно / нужно запускать параллельно" используйте ThreadPool — он умница и сам справится.
Видимо я что-то сильно недопонимаю, но когда задач действительно много (сотни и больше) то ни разу не умница, и не справляется. Вешает машину, задачи вылетают по таймауту...
Пытался выставлять ограничение в ThreadPool.SetMaxThreads — в целом ситуация не решилась.
В результате загружаю в ThreadPool задачи контролируя сколько у него занято потоков, чтобы было не более Environment.ProcessorCount
Не покидает ощущение, что все-таки что-то не так делаю.