JRo*_*han 8 .net c# multithreading
我有一个.NET应用程序,我希望有5个长时间运行的线程,包括主线程.我可以看到确实在代码库中新增了4个线程,我相信在任何地方都没有直接(例如工作项排队/任务)或间接(例如计时器)使用ThreadPool.至少我找不到任何东西.
在性能监视器下运行应用程序会显示已识别线程的数量保持不变为5(正如我所料),但物理线程数在大约一小时内波动在70到120之间!
有谁知道为什么有这么多未使用的(据我所知)物理线程?为什么这个数字会波动?
我找不到任何可以解释这种行为的文档,所以我最好的猜测是ThreadPool能够平衡自身,以适应不断变化的环境因素,如空闲内存和资源争用,但这里的数字似乎过多.
更新
微软的一位高级支持工程师证实,正在使用的物理线程计数器肯定只报告当前进程的线程,尽管MSDN中有一些奇怪的措辞.如果答案表明情况并非如此,则需要指向一个明确的来源.
ThreadPools和GC都创建了线程.有一个普通(或"工人")线程池和一个IO线程池.正常的线程池将分配新线程,因为它认为需要保持线程池响应.它应该立即为每个CPU创建一个线程,并且在此之后可能每秒创建一个线程,直到最小的线程数.请参阅ThreadPool.GetMinThreads工作线程池将创建的最小工作线程数.请参阅ThreadPool.GetAvailableThreads工作线程池中"活动"工作线程的数量.如果您使用工作线程池线程长时间运行线程,这将使其认为该线程正在使用中并分配另一个线程来为将来的请求提供服务.
池中还有一个最大的线程数,因此当线程回收到池中时,池可以杀掉一些关闭以返回到#它决定最好.
还有一个终结者线程.
可能有其他人没有记录或者是您正在使用的库的结果.
我认为问题的一部分是对"已识别的线程"和"物理线程"以及"未使用的线程"的混淆.已识别的线程记录为(强调我的)
这些线程与相应的托管线程对象相关联.运行时不会创建这些线程,但它们至少在运行时内运行一次.
物理线程记录为(强调我的)
公共语言运行库创建并拥有本机操作系统线程,以充当托管线程对象的底层线程
我猜测@JRoughan的术语"未使用的线程"是指"物理线程" - 那些不被"识别"的.这并不意味着他们没有被使用,他们只是不在公认的柜台.正如文档所指出的那样,"物理线程"是由运行时创建的,我不相信你能从这些计数器中判断一个线程是"使用"还是"未使用" - 取决于@JRoughan所指的是什么"没用过".
小智 1
您在性能监视器中测试的应用程序是独立的 .net 应用程序还是 IIS 下的应用程序?如果它是一个独立的应用程序,您可能会添加一些额外的库/代码来使用性能监视器。它可能会创建线程。
您可以使用 Sysinternals 的 Process Explorer 来监视进程中的线程。您可以看到哪个模块在哪个方法中启动了线程。

| 归档时间: |
|
| 查看次数: |
1033 次 |
| 最近记录: |