。NET / .NET Core中异步I / O期间线程池的完成端口线程如何工作?

问题描述 投票:1回答:1

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

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

  • 如果我启动异步I / O操作(例如,用于文件,管道或网络),我怀疑当前线程调度了异步请求。我还知道(通过《通过C#进行CLR》这本书)CLR注册到了一个I / O完成端口,该端口用于执行重叠的异步I / O。我怀疑此IOCP已绑定到异步操作,以便以后可以将异步操作结果排队到线程池中。 因此,我的假设是正确的,即启动异步请求时没有IOCP线程被触摸?
  • 我怀疑,当通过CLR的I / O完成端口报告异步I / O操作的结果时,这里就是IOCP线程所在的位置。结果排队到线程池中,并使用IOCP线程来处理它。但是,当阅读一些论坛线程like this one on MSDN时,我感到IOCP线程实际上是用于分派请求,然后阻塞直到结果返回。 是这种情况吗?当I / O操作由相对的系统处理时,IOCP线程是否阻塞?
  • async awaitSynchronizationContext呢? IOCP线程是否处理异步I / O响应,然后例如在UI线程上对继续进行排队[](假设未调用ConfigureAwait(false))?
  • Linux / MacOS X上的.NET Core怎么样?没有I / O完成端口-是否以任何方式对其进行仿真?

。NET / .NET核心线程池在内部使用两种不同类别的线程:辅助线程和I / O完成端口(IOCP)线程。两者都是普通的托管线程,但是用于不同的...

.net asynchronous .net-core threadpool iocp
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.