10

定期的に、本番環境でWindowsサービスをシャットダウンすると、再現できない問題が発生します。それが再び起こるまでに数ヶ月かかることがあります。

私は問題を解決するためにいくつかの診断を入れています。私が見ていることの1つは、アプリケーションのシャットダウンを開始してから60秒間システムスレッドプールにイベントを追加することです。アプリケーションは、最大10秒以内に正常にシャットダウンする必要があります。

このイベントでは、プロセスの残りの実行中のスレッドをイベントログにトレースしたいと思います。

System.Diagnostics.Process.GetCurrentProcess.Threadsを使用して実行中のスレッドを取得できます。これらのスレッドオブジェクトには、ネイティブのWin32スレッドIDなどがあります。

これらのスレッドIDから、現在のプロセスでそれらが表す管理対象スレッドに戻る方法があるかどうか疑問に思いました。私がこれを行おうとしている理由は、スレッドプールや他のスレッドに対して、それらの目的を表す名前を付けるためです。これらを取り戻すのに非常に役立ちます。

4

2 に答える 2

12

これは、次の理由で不可能です。MSDNからの引用

アンマネージドホストはマネージドスレッドとアンマネージドスレッド間の関係を制御できるため、オペレーティングシステムのThreadIdにはマネージドスレッドとの固定関係はありません。具体的には、洗練されたホストはCLR Hosting APIを使用して、同じオペレーティングシステムスレッドに対して多くの管理対象スレッドをスケジュールしたり、異なるオペレーティングシステムスレッド間で管理対象スレッドを移動したりできます。

したがって、管理対象スレッドとOSスレッドの間に1対1のマッピングはありません。

では、現在のプロセスで現在実行されているすべての管理対象スレッドのリストを取得するにはどうすればよいのでしょうか。残念ながら答えはわかりません。

于 2009-11-17T15:59:20.710 に答える
0

これが可能ではないようです。
幸いなことに、.NETライブラリをラップする独自のスレッドライブラリがあり、これらの診断に使用できるアクティブなスレッドのリストを保持する機能を組み込むことができました。
これは非常にうまく機能しますが、もちろんかなりの労力とテストが必要でしたが、うまくいけば、その根底にあるものになるでしょう。

于 2009-11-19T10:20:52.493 に答える