“泄漏”螺纹手柄

时间:2012-12-11 19:33:03

标签: .net multithreading wcf c#-4.0 threadpool

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

According documentation

  

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

因此,如果你有这么多句柄,你的应用程序会不断产生新的线程。另一方面,性能监视器中接近恒定数量的线程表示创建线程代替可回收的线程。

ThreadPool课程文档:

  

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

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