Я не понимаю точно, что происходит за кулисами, когда у меня есть асинхронное действие на контроллере MVC, особенно при работе с операциями ввода-вывода. Скажем, у меня есть действие для загрузки:
public async Task<ActionResult> Upload (HttpPostedFileBase file) {
....
await ReadFile(file);
...
}
Из того, что я знаю, это основные шаги, которые происходят:
-
Новый поток просматривается из threadpool и назначается для обработки входящего запроса.
-
Когда ожидание попадает, если вызов является операцией ввода-вывода, исходный поток возвращается в пул, а элемент управления передается на так называемый IOCP (порт завершения ввода вывода). Я не понимаю, почему запрос все еще жив и ждет ответа, потому что в конечном итоге вызывающий клиент будет ждать завершения нашего запроса.
Мой вопрос: кто/когда/как это дожидается полной блокировки?
Примечание. Я видел сообщение в блоге Нет темы, и это имеет смысл для графических приложений, но для этого сценария на стороне сервера я не понимаю. На самом деле.