首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自UI线程的ReadToEndAsync

来自UI线程的ReadToEndAsync
EN

Stack Overflow用户
提问于 2013-05-02 02:20:00
回答 1查看 917关注 0票数 2

如果我从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线程上运行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-02 03:13:24

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

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

没有线程。

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

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

但是,总是有一个线程来执行异步操作的想法是不正确的。不要试图控制线程--这是不可能的。取而代之的是,只试着认识到事实:没有线索。

编辑:扩展了此答案into a blog post

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16323946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档