Ух ты! Не связывайтесь с подсчетом ThreadPool, если вы не знаете, что делаете - многие важные службы .NET могут использовать его и полагаться на то, что он не насыщен. Вы почти наверняка заблокировали часть основного кода ввода-вывода через насыщение.
Я полагаю, что в этом конкретном случае вас отключают порты завершения ввода-вывода ...
У Джо Даффи (который знает больше о потоках, чем я когда-либо узнаю) есть некоторые мысли по этому поводу здесь .
Re, как заблокировать это через насыщение - это просто воспроизвести в мысленном эксперименте; Предположим, у вас есть немного рабочего кода, который должен сделать 2 вещи ... мы поместим 1 из них в ThreadPool и сделаем один самостоятельно; выполнив нашу собственную работу, мы присоединимся к () [или эквиваленту ThreadPool] ко второй задаче, чтобы мы знали, что оба завершены.
Теперь представьте, что мы запускаем этот рабочий код в последнем доступном потоке ThreadPool: мы делаем свою собственную работу, а затем ждем сигнала о том, что 2-е задание завершено - но нет доступных потоков для его выполнения! И мы не можем выпускать свои собственные, так как мы все еще ждем.
Вы можете сделать то же самое с портами завершения ввода / вывода.