ReadToEndAsync из потока пользовательского интерфейса



Если я вызову await ReadToEndAsync из потока пользовательского интерфейса на Windows Phone 8, в каком контексте ReadToEndAsync будет выполнять свою работу? Будет ли задача поставлена в очередь для обработки самим потоком пользовательского интерфейса или Новый Поток выполнит эту работу.



Исходя из этого:



Http://blogs.msdn.com/b/ericlippert/archive/2010/11/04/asynchrony-in-c-5-0-part-four-it-s-not-magic.aspx



Похоже, что он будет работать в потоке пользовательского интерфейса.

731   1  
c#

1 ответ:

Это сущностная истина async в ее чистейшей форме: нет никакой нити.

Для истинно асинхронного потока, ReadToEndAsync не имеет почти никакой работы, чтобы сделать. Когда вы вызываете этот метод, он просто просит среду выполнения прочитать до конца и уведомить его, когда операция завершена (через Task). Среда выполнения обращается к ОС, просит ее прочитать и уведомляет ее, когда операция завершена (например, через IOCP). Операционная система обращается к драйверу устройства, просит его прочитать и уведомляет его, когда операция выполняется. полная (например, через IRP). Драйвер устройства обращается к устройству, просит его прочитать и уведомляет о завершении операции (например, через IRQ).

Нет никакой нити.

Это, конечно, идеальная ситуация. В реальном мире в какой-то момент операция "чтение до конца" разбивается на несколько операций "чтение n байт", и они должны быть сшиты вместе. Этот (крошечный) объем работы выполняется с использованием заимствованных потоков: непознаваемых потоков для кода режима ядра и потока потоки пула для кода пользовательского режима.

Кроме того, есть некоторые ситуации, когда асинхронный API не существует. В этих случаях асинхронная работа подделывается с помощью потока пула потоков. Например, если вы вызываете ReadToEndAsync на MemoryStream, нет никаких асинхронных API для чтения из памяти, так что это ложная асинхронная операция, которая будет выполняться в пуле потоков.

Но идея о том, что для выполнения асинхронной операции всегда должен существовать поток, не соответствует действительности. Не пытайтесь контролировать нить-это невозможно. Вместо этого просто попытайтесь осознать истину: нет никакой нити.

Edit: расширил этот ответ в блоге.

Comments

    Ничего не найдено.