Ваше приложение, вероятно, зависает, потому что вы заполняете его до того момента, когда все активные потоки ожидают в очередях. (Я предполагаю, что исходный поток ожидает выполнения рабочего (ых) элемента (ов), который он ставит в очередь.)
ThreadPool по умолчанию имеет 25 * (количество процессоров) рабочих потоков (IIRC).
Вы, вероятно, хотите переделать способ, которым вы ставите в очередь предметы. Если вы ставите их в очередь, а затем заканчиваете и выходите из потока, у вас все хорошо, но работа с элементами, ожидающими другие процессы, как правило, плохой дизайн; если это то, что вы делаете, вам, вероятно, нужно использовать реальные темы или совершенно другой дизайн. Использование реальных потоков, вероятно, не менее плохая идея, потому что все, что будет делать (основываясь на том, что я могу догадаться о вашем использовании), вы просто создадите большое количество потоков, которые не принесут ничего хорошего вашей производительности.
Лучшим дизайном может быть наличие какой-либо очереди или стека, в которые несколько (2-4 в зависимости от количества процессоров) рабочих потоков добавляют элементы и извлекают элементы для работы. Если элементу нужно поставить в очередь новый элемент, он просто добавляет его в стек (и добавляет себя обратно в стек с некоторым отслеживанием зависимостей, если ему нужно ждать другого элемента).