ReadToEndAsync from UI Thread

本文关键字:Thread UI from ReadToEndAsync | 更新日期: 2023-09-27 18:11:37

如果我从Windows Phone 8的UI线程调用await 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线程上运行

ReadToEndAsync from UI Thread

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

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

没有线程。

当然,这是一个理想的情况。在现实世界中,在某些情况下,"读到结束"操作被分解成几个"读n字节"操作,这些操作需要重新拼接在一起。这(微小的)工作量是使用借来的线程完成的:内核模式代码的不可知线程和用户模式代码的线程池线程。

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

但是必须有一个线程来执行异步操作的想法是不正确的。不要试图控制线程——那是不可能的。相反,只要试着认识到这个事实:没有线程。

编辑:将此回答扩展为一篇博客文章。