ReadToEndAsync из потока пользовательского интерфейса
Если я вызову await ReadToEndAsync из потока пользовательского интерфейса на Windows Phone 8, в каком контексте ReadToEndAsync будет выполнять свою работу? Будет ли задача поставлена в очередь для обработки самим потоком пользовательского интерфейса или Новый Поток выполнит эту работу.
Исходя из этого:
Похоже, что он будет работать в потоке пользовательского интерфейса.
1 ответ:
Это сущностная истина
asyncв ее чистейшей форме: нет никакой нити.Для истинно асинхронного потока,
ReadToEndAsyncне имеет почти никакой работы, чтобы сделать. Когда вы вызываете этот метод, он просто просит среду выполнения прочитать до конца и уведомить его, когда операция завершена (черезTask). Среда выполнения обращается к ОС, просит ее прочитать и уведомляет ее, когда операция завершена (например, через IOCP). Операционная система обращается к драйверу устройства, просит его прочитать и уведомляет его, когда операция выполняется. полная (например, через IRP). Драйвер устройства обращается к устройству, просит его прочитать и уведомляет о завершении операции (например, через IRQ).Нет никакой нити.
Это, конечно, идеальная ситуация. В реальном мире в какой-то момент операция "чтение до конца" разбивается на несколько операций "чтение n байт", и они должны быть сшиты вместе. Этот (крошечный) объем работы выполняется с использованием заимствованных потоков: непознаваемых потоков для кода режима ядра и потока потоки пула для кода пользовательского режима.Кроме того, есть некоторые ситуации, когда асинхронный API не существует. В этих случаях асинхронная работа подделывается с помощью потока пула потоков. Например, если вы вызываете
Но идея о том, что для выполнения асинхронной операции всегда должен существовать поток, не соответствует действительности. Не пытайтесь контролировать нить-это невозможно. Вместо этого просто попытайтесь осознать истину: нет никакой нити.ReadToEndAsyncнаMemoryStream, нет никаких асинхронных API для чтения из памяти, так что это ложная асинхронная операция, которая будет выполняться в пуле потоков.Edit: расширил этот ответ в блоге.
Comments