我读了一些关于窗口线程池的部分。它看起来像CLR线程池。
CLR基于Windows,因此CLR线程基于Windows线程池,是不是正确?
我知道每个.net进程都有一个线程池,windows线程池中的情况是什么?操作系统有一个线程池还是多个?
在C#中,开发人员可以通过代码控制窗口线程池吗?
答案 0 :(得分:16)
这些CLR实施问题之一并没有直接的答案。 CLR无法确定ThreadPool的实现方式。这是 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用于线程池。 CreateThreadPool() winapi函数可以实现滚动。但是,使用dumpbin.exe / imports戳我的机器上的mscor * .dll文件时,我看不到它被使用了。至少部分问题可能是CreateThreadPool()是后来的winapi函数,仅在Vista之后可用。 XP和早期的Windows版本实现起来要简单得多。所以,不,至少对于桌面版的.NET 4.5.2,Windows线程池似乎并不相关。