2014-07-12 99 views
5

我读了一些关于窗口线程池的片段。它看起来像CLR线程池。windows线程池和CLR线程池有什么区别

CLR基于Windows,所以CLR线程基于windows线程池,是不是?

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

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

+3

当您询问您阅读的内容时,请添加一个链接(或至少一个发布名称)。 –

回答

13

这是CLR实施问题之一,没有一个直接的答案。确定ThreadPool的实现方式不取决于CLR。这是CLR主机的工作。一层将CLR与操作系统集成的软件。 CLR用来完成线程池事情的核心接口是IHostThreadPoolManager。它是一个非托管的COM接口,但您在识别与ThreadPool类成员几乎一对一的映射时几乎没有任何问题。

还有许多 CLR主机的实现。更可识别的是用于桌面应用程序的默认CLR主机,由mscoree.dll实现。它有不同版本的Windows版本。还有ASP.NET,Sql Server,Visual Studio Hosting进程,Silverlight的自定义主机,Windows Phone,XBox。而不那么可识别的,大型非托管应用程序可以自己托管CLR,以支持使用.NET语言实现的脚本。 AutoCAD等CAD程序是标准示例。

线程的核心概念是在CLR中虚拟化的。 IClrTask和IClrTaskManager是它的主机接口。它允许主机在除操作系统线程以外的其他东西上实现线程。像纤维一样。没有人真的这样做顺便说一句。

当然,Windows有一个线程池自己的api。 winapi函数CreateThreadPool()可以让球滚动。但是,在我的机器上用dumpbin.exe/imports打开mscor * .dll文件,我没有看到它被使用。至少部分问题可能是CreateThreadPool()是一个后来的winapi函数,只有在Vista以后才可用。 XP和更早的Windows版本有一个更简单的实现。所以,不,至少对于.NET 4.5.2的桌面版本来说,Windows线程池似乎并不相关。