c# - Windows线程池和CLR线程池有什么区别

标签 c# multithreading clr pool

我读了一些关于窗口线程池的片段。它看起来像 CLR 线程池。

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

我知道每个.net进程都有一个线程池,windows线程池是什么情况?操作系统有一个线程池还是多个?

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

最佳答案

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

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

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

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

关于c# - Windows线程池和CLR线程池有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24713090/

相关文章:

Python 在 PyQt5 应用程序中因 2 个工作线程而崩溃

c# - 为什么我的代码认为一个值是 Microsoft.IdentityModel.Json.Linq.JObject 而实际上应该是 Newtonsoft.Json.Linq.JObject?

linux - 多线程、阻塞和内存映射文件

java - 暂停或 hibernate AsyncTask 而不影响 UI

java - 将 Java 移植到 J# 时出现问题

.net - 如何找出我正在使用的 CLR?

c++ - 在 C++ 非 clr 到 clr dll 之间抛出异常时如何避免内存泄漏?

c# - 中央标准时间休息一小时

c# - 集合中的 Lambda 运算符

c# - Windows、.NET 读取鼠标光标下的文本