如果我从Windows phone8上的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线程上运行。
发布于 2013-05-02 03:13:24
这是async最纯粹的形式的一个基本事实:没有线程。
对于真正的异步流,ReadToEndAsync几乎没有工作要做。当您调用该方法时,它只是要求运行时读到最后,并在操作完成时通知它(通过Task)。运行时转向OS,要求它读取,并在操作完成时通知它(例如,通过IOCP)。OS转向设备驱动程序,要求它读取,并在操作完成时通知它(例如,通过IRP)。设备驱动程序转向设备,要求它读取,并在操作完成时通知它(例如,通过IRQ)。
没有线程。
当然,这是一种理想的情况。在现实世界中,在某些情况下,“读到尾”操作被分解为几个“读n字节”操作,这些操作需要重新缝合在一起。这些(微小的)工作是使用借用的线程完成的:内核模式代码的不可知线程和用户模式代码的线程池线程。
此外,在某些情况下,不存在异步API。在这些情况下,异步工作是使用线程池线程伪造的。例如,如果在MemoryStream上调用ReadToEndAsync,则没有用于从内存读取的异步API,因此这是一个将在线程池上运行的假异步操作。
但是,总是有一个线程来执行异步操作的想法是不正确的。不要试图控制线程--这是不可能的。取而代之的是,只试着认识到事实:没有线索。
编辑:扩展了此答案into a blog post。
https://stackoverflow.com/questions/16323946
复制相似问题