8

IIS でホストされている WCF アプリケーションがあります ( で記述C#/.Net 4)。時間の経過とともに、プロセスのハンドル カウントはほぼ直線的に増加します (プロセスがリサイクルされる前に 30,000 まで増加します)。SysInternals Process Explorer によると、プロセスが持つハンドルの大部分はThread. ただし、パフォーマンス モニターによると、スレッド数はほぼ一定 (40 前後) のままです。

明らかに、私は何か間違ったことをしており、漏れていThread Handlesます。Thread Handleただし、このコンテキストでa が何であるかは正確にはわかりません。これはスレッドへのハンドルであると想定していましたが、スレッドの数は一貫しているため、ハンドル数がどのように増加しているかはわかりません。そして、スレッド自体が消えている間、スレッドへのハンドルを保持する方法は考えられません。さらに、私は明示的に新しいスレッドを作成していません (私はThreadPool場所で使用しています)。

明らかに、私は何かが欠けています。しかし、何?

4

2 に答える 2

1

終了したスレッドへのハンドルを持つことができます。したがって、スレッドが作成されて終了しますが、ハンドルは残ります。

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

誰がスレッドを作成しているかという質問に答える必要があります。彼はハンドルを閉じる責任があります。

于 2012-12-14T11:10:00.333 に答える
0

ドキュメントによると

CreateThreador関数によって新しいスレッドが作成されるCreateRemoteThreadと、スレッドへのハンドルが返されます。

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

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

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

したがって、アプリケーションの動作はThreadPool.

于 2012-12-14T09:36:40.200 に答える