C# 线程池是否在应用程序域之间共享?

C# 线程池是否在应用程序域之间共享?,c#,.net,multithreading,clr,C#,.net,Multithreading,Clr,考虑一个正在创建多个应用程序域的流程。这些应用程序域是否共享相同的线程池?如果是,多个应用程序域之间是如何协调的?不是100%确定,但我认为线程池是 每个进程一次,而不是每个AppDomain一次。请在上阅读本文:线程池在所有appdomains之间共享,因为每个线程池线程都是上下文无关的,并且整个线程池运行时配置文件高度依赖于您运行的硬件(进程、超线程等) 每个进程有一个线程池。 线程池的默认大小为 每个可用处理器25个线程。 线程中的线程数 可以使用 SetMaxThreads方法。每个线程

考虑一个正在创建多个应用程序域的流程。这些应用程序域是否共享相同的线程池?如果是,多个应用程序域之间是如何协调的?

不是100%确定,但我认为线程池是
每个进程一次,而不是每个AppDomain一次。请在上阅读本文:

线程池在所有appdomains之间共享,因为每个线程池线程都是上下文无关的,并且整个线程池运行时配置文件高度依赖于您运行的硬件(进程、超线程等)

每个进程有一个线程池。 线程池的默认大小为 每个可用处理器25个线程。 线程中的线程数 可以使用 SetMaxThreads方法。每个线程使用 默认堆栈大小,并在 默认优先级

资料来源:


如果我没记错的话,CLR会在内部处理线程池线程,并在服务另一个工作请求之前清理线程上下文。

线程池在所有appdomains之间共享-因为这意味着线程可能最终会在appdomains之间切换(可能经常!)。围绕这一点,有一些perf工作:

[…]事实上,我们违反了这个“规则” 已经:自.NET3.5以来,CLR 线程池保持了单独的 中每个AppDomain的FIFO队列 流程,以及一个额外的独立 “本机”工作项的FIFO队列 例如由主机排队的那些 (ASP.net是此应用程序的主要用户 特征)。我们在两人之间进行循环 这些工作队列允许每个 之前执行工作一段时间 继续下一步。[…]


顺便说一句,请注意,严格来说,线程池不再在整个进程中共享,因为v4 CLR允许与V2并行加载,并且每个线程池都有自己的线程池。

这是指向.NET 4最新文档的链接。每个可用处理器有250个工作线程。