Термин «рабочий поток» в .net / CLR обычно относится только к любому потоку, кроме основного потока, который выполняет некоторую «работу» от имени приложения, породившего поток.«Работа» может означать что угодно, включая ожидание завершения ввода-вывода.ThreadPool хранит кэш рабочих потоков, поскольку создавать потоки дорого.
Термин «поток ввода-вывода» в .net / CLR относится к потокам, резервируемым ThreadPool для отправки обратных вызовов NativeOverlapped из «перекрывающихся».msgstr "вызовы win32 (также известные как" завершение ввода / вывода порта ").CLR поддерживает свой собственный порт завершения ввода / вывода и может привязывать к нему любой дескриптор (через API ThreadPool.BindHandle).Пример здесь: http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx. Многие API .net используют этот механизм для получения обратных вызовов NativeOverlapped, хотя типичный разработчик .net никогда не использует его напрямую.
Технических различий между ними нет 'рабочий поток »и« поток ввода-вывода »- они оба являются обычными потоками.Но CLR ThreadPool хранит отдельные пулы каждого из них просто для того, чтобы избежать ситуации, когда высокий спрос на рабочие потоки исчерпывает все доступные потоки для отправки собственных обратных вызовов ввода-вывода, что может привести к тупиковой ситуации.(Представьте себе приложение, использующее все 250 рабочих потоков, каждый из которых ожидает завершения ввода-вывода).
Разработчик должен проявить некоторую осторожность при обработке обратного вызова ввода-вывода, чтобы обеспечить возврат потока ввода-вывода в ThreadPool, то есть код обратного вызова ввода-вывода должен выполнять минимумработа, необходимая для обслуживания обратного вызова, а затем возврата управления потоком в пул потоков CLR.Если требуется дополнительная работа, эта работа должна быть запланирована в рабочем потоке.В противном случае приложение рискует «перехватить» пул зарезервированных потоков завершения ввода-вывода CLR для использования в качестве обычных рабочих потоков, что приведет к тупиковой ситуации, описанной выше.
Несколько полезных ссылок для дальнейшего чтения: ввод-вывод win32порты завершения: http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx пул управляемых потоков: http://msdn.microsoft.com/en-us/library/0ka9477y.aspx пример BindHandle: http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx