ThreadPool вызывает зависание графического интерфейса (?) - PullRequest
0 голосов
/ 06 ноября 2008

Я замечаю, что, если максимальное число потоков ThreadPool для моего приложения с интенсивным вводом-выводом установлено слишком низким (16), мой графический интерфейс будет зависать. Но если я установлю его значительно выше (250), он будет работать просто отлично.

Кто-нибудь может объяснить это явление?

1 Ответ

3 голосов
/ 06 ноября 2008

Ух ты! Не связывайтесь с подсчетом ThreadPool, если вы не знаете, что делаете - многие важные службы .NET могут использовать его и полагаться на то, что он не насыщен. Вы почти наверняка заблокировали часть основного кода ввода-вывода через насыщение.

Я полагаю, что в этом конкретном случае вас отключают порты завершения ввода-вывода ...

У Джо Даффи (который знает больше о потоках, чем я когда-либо узнаю) есть некоторые мысли по этому поводу здесь .

Re, как заблокировать это через насыщение - это просто воспроизвести в мысленном эксперименте; Предположим, у вас есть немного рабочего кода, который должен сделать 2 вещи ... мы поместим 1 из них в ThreadPool и сделаем один самостоятельно; выполнив нашу собственную работу, мы присоединимся к () [или эквиваленту ThreadPool] ко второй задаче, чтобы мы знали, что оба завершены.

Теперь представьте, что мы запускаем этот рабочий код в последнем доступном потоке ThreadPool: мы делаем свою собственную работу, а затем ждем сигнала о том, что 2-е задание завершено - но нет доступных потоков для его выполнения! И мы не можем выпускать свои собственные, так как мы все еще ждем.

Вы можете сделать то же самое с портами завершения ввода / вывода.

...