2012-12-11 61 views
8

我有一个WCF应用程序托管在IIS中(编写在C#/.Net 4)。随着时间的推移,过程的处理计数或多或少呈线性增加(在处理回收之前增加高达30,000)。根据SysInternals Process Explorer,该进程拥有的大量句柄的类型为Thread。但是,根据性能监视器,线程数量保持不变(大约40)。“泄漏”线程句柄

显然,我做错了事,正在泄漏Thread Handles。但是,我不清楚在这种情况下究竟是什么Thread Handle。我会假设它是一个线程的句柄,但由于线程的数量保持一致,所以我不知道句柄数如何增加。而且,我想不出任何方法来保持线程的处理,而线程本身消失。此外,我不明确地创建新线程(我在地方使用ThreadPool)。

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

+0

您是否将WCF服务设置为SingleInstance,PerCall或Session?你在那里使用IoC容器吗? – Jordi

+0

你是自己管理线程,还是使用线程池?哪种类型的线程使用您的应用程序(我们是在讨论IIS所执行的线程 - >受到IIS本身或您自己的线程的限制)? – Rafa

+0

WCF服务是单实例和多并发。没有IOC容器。 –

回答

0

According documentation

当由CreateThreadCreateRemoteThread函数创建一个新的线程,则返回的句柄线程。

所以,如果你有太多的句柄,你的应用程序会不断产生新的线程。从另一方面来说,性能监视器中的线程数量接近恒定,表示线程是在循环线程中创建的。

ThreadPool类文档:

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

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

+0

@布莱恩拉斯穆森谢谢 – VMAtm

1

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

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

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