在 .NET / .NET Core 中,线程池的完成端口线程在异步 I/O 期间如何表现?

How do Completion Port Threads of the Thread Pool behave during async I/O in .NET / .NET Core?

.NET / .NET Core 线程池在内部使用两种不同类别的线程:工作线程和 I/O 完成端口 (IOCP) 线程。两者都是普通的托管线程,但用于不同的目的。通过不同的 API(例如 Task.StartThreadPool.QueueUserWorkItem),我可以在工作线程上启动 CPU 绑定的异步操作(不应阻塞,否则线程池可能会创建额外的工作线程).

但是执行 I/O 绑定的异步操作呢? IOCP 线程在这些情况下的行为如何?具体来说,我有以下问题:

Damien 和 Hans 在评论中为我指出了正确的方向,我想在这个答案中总结一下。

Damien 指出 Stephen Cleary's awesome blog post 回答了前三点:

  • 异步 I/O 操作在调用线程上分派。不涉及 IOCP 线程。
  • 因此,在异步期间没有 IOCP 线程阻塞 I/O。
  • 当结果返回到 .NET 应用程序时,借用一个 IOCP 线程来标记任务完成。继续排队到目标 SynchronizationContext 或线程池。

Hans指出在Linux(epoll)和IOCP中有类似的机制 MacOS(kqueue)。