繁体   English   中英

什么使.NET Task在等待I / O完成后能够继续执行?

[英]What allows a .NET Task to continue after waiting for I/O to complete?

我一直在通过C#遍历《 CLR》一书。 我在第28章中,谈论I / O绑定线程。

我认为这是我的理解:每个线程都有自己的堆栈。 当您使用异步并一直等待直到(包括)您的IO时,系统会将IO请求数据包(IRP)发送到设备的IRP队列。 IO操作完成后,完成的IRP将“回到”线程池,并且线程池分配资源以在异步进程停止的地方继续运行

我的问题是:当CLR线程将控制权移交给IO设备时,该CLR线程会怎样? 该线程的堆栈是否全部弹出并返回到线程池? 而且,如果弹出该窗口以进行重用,那么该堆栈对于等待IO完成的进程状态的延续不是必不可少的吗? IO完成后,计算机如何(依次)知道原始CLR线程在哪里? 它怎么知道在哪里停下来的地方“捡起来”

CPU中是否有一个指针可以记住:“嘿,当您要求所有这些IO时,您就在程序逻辑中,这是您需要重新启动的地方”?

否。异步I / O的恢复是通过一系列回调完成的。 IOCP回调到在.NET I / O线程池线程上运行的完成例程,该例程最终将完成Task ,从而导致任务继续运行,并继续执行async方法。 有关更多信息,请参见我的博客文章《没有线程》

还要注意的是async方法不一定在同一个线程恢复。 有关如何在特定上下文中恢复await更多信息,请参阅我的博客文章Async and Await

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM