什么允许.NET任务在等待I / O完成后继续?

时间:2016-08-30 00:07:51

标签: c# .net multithreading task clr

我一直在通过C#翻阅CLR这本书。我在第28章,谈论I / O绑定线程。

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

我的问题是:当CLR线程将控制权移交给IO设备时,该CLR线程会发生什么?该线程的堆栈是否全部弹出并返回到线程池?如果它被弹出以便重新使用,那么继续等待IO完成的进程状态对于那个堆栈是不是必不可少的?当IO完成时,计算机如何知道(顺序)原始CLR线程的位置? 它如何知道从哪里“退回”中断

1 个答案:

答案 0 :(得分:3)

  

CPU中是否有一个指针可以记住,"嘿,当你要求所有这些IO时,你就在程序逻辑中,这里你需要重新开始#34 ;

没有。异步I / O的恢复是通过一系列回调完成的。 IOCP回调到一个在.NET I / O线程池线程上运行的完成例程,该线程最终完成Task,这会导致任务继续运行,并继续执行async方法。有关详细信息,请参阅我的博文There Is No Thread

另请注意,<{1}}方法必须在同一个线程上恢复。有关async如何在特定情境中恢复的详细信息,请参阅我的博文Async and Await