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