来自UI线程的ReadToEndAsync

时间:2013-05-01 18:20:00

标签: c# windows-phone-8

如果我从Windows Phone 8上的UI线程调用等待ReadToEndAsync,那么ReadToEndAsync将在什么上下文中运行?任务是否会由UI线程本身排队等待处理,或者新线程是否会完成工作。

基于此:

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

它似乎会在UI线程上运行。

1 个答案:

答案 0 :(得分:6)

这是async最纯粹形式的基本事实:没有线索。

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

没有线程。

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

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

但是总是必须有一个线程来执行异步操作的想法并不是事实。不要试图控制线程 - 这是不可能的。相反,只是试图实现真相:没有线索。

修改:扩展了此答案into a blog post