c# - 来自 UI 线程的 ReadToEndAsync

标签 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 线程上运行。

最佳答案

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

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

没有线程。

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

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

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

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

关于c# - 来自 UI 线程的 ReadToEndAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16323946/

相关文章:

xaml - 如何在 Windows Phone 8 XAML 中更改段落边距?

sqlite - 如何在SQLite Select语句中正确表达参数

c# - 单击 TreeNode 时发生类型为 'System.NullReferenceException' 的未处理异常

c# - CSLA getproperty、setproperty和一般getters和setters的区别

c# - FileNotFoundException 抛出时间太长,有没有办法缩短超时?

sqlite - 适用于 Windows 7 和 Windows 8 手机的 Phonegap/Cordova SQLite 插件?

windows-phone-7 - Windows Phone 中的 SSL 证书验证

windows-8 - 在 Win8 和 WP8 应用程序中共享静态库

c# - 如何限制/截断数组?

c# - 使用泛型参数创建方法