Нельзя блокировать потоки TP в запросах базы данных. Фраза в кавычках гласит, что это нормально, если все потоков TP блокируют такие запросы. С этим не поспоришь, но это выглядит довольно искусственно.
Основная задача диспетчера потоков состоит в том, чтобы он никогда не выполнял больше потоков, чем имеется в доступных ядрах на машине. Поскольку многопоточность неэффективна, переключение контекста между потоками довольно дорого. Это, однако, не будет работать очень хорошо, если выполняющийся поток TP блокирует и не выполняет никакой реальной работы. Менеджер TP не настолько умен, чтобы знать , что поток TP блокирует, и не может предсказать, как долго он будет блокироваться. Только движок dbase может догадаться об этом, и он не говорит.
Таким образом, у менеджера TP есть простой алгоритм для решения этой проблемы: если ни один из выполняющихся потоков TP не завершает работу в течение разумного времени, то он позволяет запустить другой. Теперь у вас есть больше активных потоков, чем у процессорных ядер. «Разумное время» для диспетчера .NET TP составляет полсекунды.
Это продолжается при необходимости, дополнительные потоки могут работать, пока существующие застряли в колее.
На самом деле получение количества потоков ThreadPool.GetMaxThreads () невероятно вредно для здоровья. Это огромное число, в 250 раз превышающее количество ядер в машине. На 4-ядерном компьютере, чтобы достичь максимума, потребуется 999 исполняющихся потоков, которые не достигли прогресса в течение 499 секунд. Эти потоки будут использовать для своих стеков классное гигабайт адресного пространства. Вы далеко за пределами наблюдения "здесь что-то не так", если оно когда-либо попадет туда.
В этом ответе есть несколько простых количественных чисел. Как только операция начинает занимать более полсекунды, вам нужно подумать о том, чтобы выполнить ее в выделенном потоке. Запись на полсекунды действительно возможна только при блокировке, поэтому поток гораздо более уместен, чем поток TP. И да, используйте потокобезопасную очередь, чтобы заполнить ее запросами операций. Также важно, чтобы вы установили верхний предел количества ожидающих запросов, чтобы не затопить очередь. Дросселировать производителя путем блокировки. И, конечно же, не забывайте, что будет через год. Базы данных никогда не становятся быстрее, когда они стареют.