2012-12-11 95 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)並將其設置爲偵聽「進程和線程活動」(禁用文件,註冊表和網絡)。確定誰是通過雙擊線程創建事件並查看堆棧來創建線程。

這應該回答誰在創建線程的問題。他負責關閉手柄。