2012-12-11 5 views
8

私はIISでホストされているWCFアプリケーションを持っています(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:新しいスレッドがCreateThreadまたはCreateRemoteThread機能によって作成された場合

、スレッドへのハンドルが返されます。

ハンドルが非常に多い場合、アプリケーションは常に新しいスレッドを生成します。反対側からは、パフォーマンスモニタのスレッド数がほぼ一定になると、スレッドはリサイクルされたスレッドの代わりに作成されます。

ThreadPoolクラスのドキュメント:

の.NET Framework 4以降では、スレッドプールは、単位当たりの完全なタスクの数として定義されるスループットを最適化するためにワーカースレッドを作成し、破棄します時間の。使用可能なリソースを最適に使用できないスレッドが少なすぎると、スレッドが多すぎるとリソースの競合が増える可能性があります。

だからあなたのアプリケーションの動作はThreadPoolのためだと思います。

+0

@Brian Rasmussenありがとう – VMAtm

1

終了スレッドにハンドルを割り当てることができます。したがって、スレッドは作成され、終了しますが、ハンドルは残ります。

プロセスモニタ(procmon.exe)を起動し、「プロセスとスレッドアクティビティ」(ファイル、レジストリ、ネットワークを無効にする)を待機するように設定します。スレッド作成イベントをダブルクリックしてスタックを見て、スレッドを作成しているユーザーを特定します。

これは、スレッドを作成している人の質問に答える必要があります。彼はハンドルを閉じる責任があります。

関連する問題