Очень сложно найти подробное, но простое описание рабочих потоков и потоков ввода-вывода в .NET.
Что мне ясно по этой теме (но может быть технически неточным):
- Рабочие потоки - это потоки, которые должны использовать ЦП для своей работы;
- Потоки ввода-вывода (также называемые «потоками порта завершения») должны использовать для своей работы драйверы устройств и по сути «ничего не делать», а только отслеживать завершение операций, не связанных с процессором.
Что не понятного:
- Хотя метод ThreadPool.GetAvailableThreads возвращает количество доступных потоков обоих типов, похоже, что нет общедоступного API для планирования работы для потока ввода-вывода. Вы можете только вручную создать рабочий поток в .NET?
- Кажется, что один поток ввода-вывода может контролировать несколько операций ввода-вывода. Это правда? Если да, то почему ThreadPool по умолчанию имеет так много доступных потоков ввода-вывода?
- В некоторых текстах я читал этот обратный вызов, запускаемый после завершения операции ввода-вывода, выполняемой потоком ввода-вывода. Это правда? Разве это не задача рабочего потока, учитывая, что этот обратный вызов является операцией ЦП?
- Чтобы быть более конкретным - выполняются ли потоки ввода-вывода пользователей асинхронных страниц ASP.NET? В чем именно преимущество производительности при переключении операций ввода-вывода на отдельные потоки вместо увеличения максимального количества рабочих потоков? Это потому, что один поток ввода-вывода отслеживает несколько операций? Или Windows делает более эффективное переключение контекста при использовании потоков ввода-вывода?