Я пробирался через книгу CLR через C#. Я нахожусь в главе 28, рассказывая о потоковом потоке ввода-вывода.Что позволяет .NET Task продолжить работу после ожидания ввода-вывода?
Вот что я думаю, что понимаю: у каждой нити есть своя стека. Когда вы используете async и дожидаетесь до (и в том числе) вашего ввода-вывода, система отправляет пакет запросов IO (IRP) в очередь IRP вашего устройства. После завершения операции ввода-вывода завершенный IRP возвращается в пул потоков и пул потоков распределяет ресурсы до , продолжая работу, где процесс асинхронизации остался.
Мой вопрос заключается в следующем: когда поток CLR передает управление устройству ввода-вывода, что происходит с этой веткой CLR? Удаляет ли стек для этого потока все данные и возвращается в пул потоков? И если он выскочит, чтобы быть повторно использованным, разве этот стек не является обязательным для продолжения состояния процесса, ожидающего завершения ввода-вывода? Как компьютер знает, где исходный поток CLR был (последовательно), когда IO завершен? Как узнать, где «выбрать резервную копию», где он остановился?
Оставь, если вы хотите голосить, оставьте комментарий! Я думал, что это хороший вопрос. – Trevor
Документация, в том числе технические статьи MSDN, является гораздо лучшим местом для получения подробной информации о внутренней работе такого рода. Тем более, что на самом деле существует несколько различных доступных механизмов для асинхронного ввода-вывода в Windows, в зависимости от того, какое конкретное устройство ввода-вывода вы имеете в виду и какой API вы используете. –
Одним из наиболее распространенных сценариев является использование портов ввода-вывода ввода-вывода, в которых создается небольшое количество потоков и предназначено для ожидания в IOCP. Используя этот механизм, один поток может обслуживать завершение ввода-вывода для большого количества операций, эффективно используя пул потоков. –