8

我有一个托管在 IIS 中的 WCF 应用程序(用C#/.Net 4. 随着时间的推移,进程的句柄计数以或多或少的线性方式增加(在进程循环之前增加到 30,000)。根据 SysInternals Process Explorer 的说法,该进程拥有的大部分句柄都是Thread. 但是,根据性能监视器,线程数或多或少保持不变(大约 40)。

显然,我做错了什么并且正在泄漏Thread Handles。但是,我不清楚 aThread Handle在这种情况下到底是什么。我会假设它是一个线程的句柄,但由于线程数保持一致,我看不到句柄数是如何增加的。而且,我想不出任何方法来保持线程的句柄,而线程本身就消失了。此外,我没有明确地创建新线程(我正在使用ThreadPoolin 地方)。

显然,我错过了一些东西。但是什么?

4

2 回答 2

1

可以拥有终止线程的句柄。所以线程被创建,终止,但句柄仍然存在。

启动进程监视器 (procmon.exe) 并将其设置为侦听“进程和线程活动”(禁用文件、注册表和网络)。通过双击线程创建事件并查看堆栈来确定谁在创建线程。

那应该回答谁在创建线程的问题。他负责关闭把手。

于 2012-12-14T11:10:00.333 回答
0

根据文件

CreateThreadorCreateRemoteThread函数创建一个新线程时,将返回该线程的句柄。

所以如果你有这么多的句柄,你的应用程序会不断地产生新的线程。另一方面,性能监视器中几乎恒定数量的线程表明,创建线程来代替回收的线程。

ThreadPool类文档:

从 .NET Framework 4 开始,线程池创建和销毁工作线程以优化吞吐量,吞吐量定义为每单位时间完成的任务数。线程太少可能无法最佳利用可用资源,而线程太多可能会增加资源争用。

所以我认为你的应用程序行为是因为ThreadPool.

于 2012-12-14T09:36:40.200 回答