我阅读了一些有关窗口线程池的内容。它看起来像CLR线程池。

CLR基于Windows,所以CLR线程基于Windows线程池,对吗?

我知道每个.net进程都有一个线程池,Windows线程池中的情况如何?操作系统有一个或多个线程池?

在C#中,开发人员可以通过代码控制窗口线程池吗?

最佳答案

这是那些CLR实现问题之一,没有一个直接的答案。取决于如何确定如何实现ThreadPool。这是CLR主机的工作。将CLR与操作系统集成在一起的软件层。 CLR用于完成线程池操作的核心接口(interface)是IHostThreadPoolManager。它是一个不受管的COM接口(interface),但是您几乎可以轻松识别ThreadPool类成员的一对一映射。

有许多CLR主机的实现。知名度更高的是由mscoree.dll实现的桌面应用程序的默认CLR主机。对于不同的Windows版本,它具有不同的版本。以及ASP.NET,Sql Server,Visual Studio Hosting进程,Silverlight,Windows Phone,XBox的自定义主机。而知名度较低的大型非托管应用可以自己托管CLR,以支持以.NET语言实现的脚本。 CAD程序(例如AutoCAD等)是标准示例。

线程的核心概念在CLR中被虚拟化。 IClrTask和IClrTaskManager是其托管接口(interface)。这允许主机在操作系统线程以外的其他对象上实现线程。像纤维一样。实际没有人这样做。

当然,Windows对于线程池具有自己的api。 CreateThreadPool() winapi函数使该球滚动。但是,用dumpbin.exe/imports在我的机器上戳入mscor * .dll文件,我看不到它正在被使用。至少部分问题可能是CreateThreadPool()是更高版本的winapi函数,仅在Vista以后才可用。 XP和Windows早期版本的实现要简单得多。因此,不,至少对于台式机版本的.NET 4.5.2,Windows线程池似乎无关紧要。

10-04 20:35