2016-08-30 9 views
1

Я пробирался через книгу CLR через C#. Я нахожусь в главе 28, рассказывая о потоковом потоке ввода-вывода.Что позволяет .NET Task продолжить работу после ожидания ввода-вывода?

Вот что я думаю, что понимаю: у каждой нити есть своя стека. Когда вы используете async и дожидаетесь до (и в том числе) вашего ввода-вывода, система отправляет пакет запросов IO (IRP) в очередь IRP вашего устройства. После завершения операции ввода-вывода завершенный IRP возвращается в пул потоков и пул потоков распределяет ресурсы до , продолжая работу, где процесс асинхронизации остался.

Мой вопрос заключается в следующем: когда поток CLR передает управление устройству ввода-вывода, что происходит с этой веткой CLR? Удаляет ли стек для этого потока все данные и возвращается в пул потоков? И если он выскочит, чтобы быть повторно использованным, разве этот стек не является обязательным для продолжения состояния процесса, ожидающего завершения ввода-вывода? Как компьютер знает, где исходный поток CLR был (последовательно), когда IO завершен? Как узнать, где «выбрать резервную копию», где он остановился?

+0

Оставь, если вы хотите голосить, оставьте комментарий! Я думал, что это хороший вопрос. – Trevor

+0

Документация, в том числе технические статьи MSDN, является гораздо лучшим местом для получения подробной информации о внутренней работе такого рода. Тем более, что на самом деле существует несколько различных доступных механизмов для асинхронного ввода-вывода в Windows, в зависимости от того, какое конкретное устройство ввода-вывода вы имеете в виду и какой API вы используете. –

+0

Одним из наиболее распространенных сценариев является использование портов ввода-вывода ввода-вывода, в которых создается небольшое количество потоков и предназначено для ожидания в IOCP. Используя этот механизм, один поток может обслуживать завершение ввода-вывода для большого количества операций, эффективно используя пул потоков. –

ответ

1

Есть указатель где-то в CPU, который помнит: «Эй, когда вы просили все это IO, вы были здесь, в программной логике, и вот где вам нужно начинать заново»?

№. Продолжение асинхронного ввода-вывода осуществляется через цепочку обратных вызовов. IOCP обращается к процедуре завершения, которая запускается в потоке пула потоков .NET I/O, который (в конечном итоге) завершает Task, что приводит к продолжению выполнения задач, которое возобновляет выполнение метода async. Для получения дополнительной информации см. Мой блог There Is No Thread.

Также обратите внимание, что async методы делают не обязательно возобновить в той же теме. Для получения дополнительной информации о том, как await возобновляется в определенном контексте, см. Мой блог Async and Await.

+0

Спасибо, Стивен. Теперь я читаю об ожиданиях и государственных машинах. Я думаю, это то, к чему я пытаюсь добраться. Я хочу раскрыть «волшебство» того, как все это работает. Очень круто. – Trevor