这是很难找到工人的详细而简单的描述和I/O线程在.NET工人的简单描述和I/O线程在.NET
什么是很清楚,我就这个话题(但不得技术上精确):
- 工作线程,线程应该雇用CPU为他们的工作;
- I/O线程(也称为“完成端口线程”)应该应用设备驱动程序的工作和本质上“无所事事”,只监视非CPU操作的完成。
什么是不明确的:
- 虽然方法ThreadPool.GetAvailableThreads返回两种类型的可用线程数,似乎没有公共API来调度I/O线程的工作。你只能在.NET中手动创建工作线程?
- 看来,单个I/O线程可以监视多个I/O操作。这是真的吗?如果是这样,为什么ThreadPool默认有很多可用的I/O线程?
- 在一些文本中,我读到了在I/O线程完成I/O操作完成后触发的回调。这是真的吗?考虑到这个回调是CPU操作,这对于工作线程来说不是一个工作吗?
- 更具体一点 - 做ASP.NET异步页面用户I/O线程?在切换I/O工作以分离线程而不是增加最大工作线程数量方面,性能有什么好处?是否因为单个I/O线程监视多个操作?或者,Windows在使用I/O线程时会更有效地进行上下文切换?
所以一些API,它暴露APM模式(例如 - 的WebRequest),使用ThreadPool.BindHandle方法在内部。 BeginXXX方法将使用用户回调委托,给予某些设备驱动程序工作并保留ThreadPool I/O线程以“等待”完成端口通知外部设备工作完成。当收到通知时,I/O线程唤醒并运行用户回调委托代码(应该很快,以便将I/O线程快速返回到池)。 – Konstantin 2010-01-31 14:14:32
所以工作线程通常运行工作,按用户代码调度。 I/O线程通常运行工作,由框架代码调度,该框架代码与外部设备交互,需要等待完成工作并运行用户回调逻辑,此时“外部”工作完成。 这一切都正确的理解? – Konstantin 2010-01-31 14:17:48
几乎,但操作系统如何调度实际的I/O对于CLR是不透明的。 CLR的I/O线程不会被束缚等待完成;而是在操作完成时,操作系统通过I/O完成端口提醒CLR。 – alexdej 2010-02-01 18:02:24