2

If I call await ReadToEndAsync from the UI thread on Windows Phone 8, on what context will ReadToEndAsync do its work? Will a task get queued for processing by the UI thread itself, or will a new thread do the work.

Based on this:

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

it seems like it will run on the UI thread.

4

1 回答 1

6

这是async最纯粹形式的基本真理:没有线程。

对于一个真正的异步流,ReadToEndAsync几乎没有工作要做。当您调用该方法时,它只是要求运行时读取到最后,并在操作完成时通知它(通过 a Task)。运行时转向操作系统,要求它读取,并在操作完成时通知它(例如,通过 IOCP)。操作系统转向设备驱动程序,要求它读取,并在操作完成时通知它(例如,通过 IRP)。设备驱动程序转向设备,要求它读取,并在操作完成时通知它(例如,通过 IRQ)。

没有线程。

当然,这是一个理想的情况。在现实世界中,在某些时候,“读取到结束”操作被分解为几个“读取 n 字节”操作,并且需要将它们缝合在一起。那(微小的)工作量是使用借来的线程完成的:内核模式代码的不可知线程和用户模式代码的线程池线程。

此外,在某些情况下,异步 API 不存在。在这些情况下,异步工作是使用线程池线程伪造的。例如,如果您调用ReadToEndAsynca MemoryStream,则没有用于从内存读取的异步 API,因此这是一个将在线程池上运行的假异步操作。

但是,总是必须有一个线程来执行异步操作的想法是不正确的。不要试图控制线程——那是不可能的。相反,只有努力去领悟真相:没有线索。

编辑:将此答案扩展为博客文章

于 2013-05-01T19:13:24.403 回答