2008-09-19 8 views
4

私は、あらゆる種類の処理を行う複数のスレッドを持つ.NETアプリケーションで作業しています。 プロダクションで何か問題が発生したときは、どのスレッドが(管理された名前で)実行されているのかを確認し、それらを一時停止/強制終了できるようにしたいと考えています。実行中の.Netアプリケーションでスレッドを表示、一時停止、および終了する

とにかくこれを達成するには?

VSは常に利用可能なわけではありませんが、良い選択肢はありますが、WinDbg UIは軽快なものではありません。

私は、VSがデバッグ中に持っているような、プログラム内のスレッドウィンドウを考えましたが、これを行うプログラム的な方法は見つかりませんでした。 Process.GetThreadsは使用可能なデータをほとんど返しません。

答えて

2

これを行う.netには何も組み込まれていません。アクティブなスレッドをプログラム的に反復したい場合は、起動時にどこかに登録し、完了時にそれらを登録解除するか、またはそれらを処理する前にフィルタリングする必要があります。私たちはこれを実行しましたが、それは軽微な作業量を必要とします。

0

スレッドを表示/フリーズするためにマネージデバッガをアタッチすることができます。軽量化が必要な場合は、WinDbgにSOS拡張機能を使用できます。

0

ProcessExplorerを使用すると、プロセス内の実行中のスレッドをIDおよび状態で表示できます。

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

"プロパティ" ウィンドウの "スレッド" タブを使用します。

スレッドを強制終了してスレッドスタックを表示することもできます

+0

Process Explorer 16.02では、[スレッド]タブの一覧にスレッドの名前が表示されません。 – Matt

+0

あなたは正しいです:答えを編集しました – olorin

0

リモートデバッグはどうですか?セキュリティのためにセットアップするのがちょっと面倒なこともありますし、正しいデバッグシンボルを確保することもできます。

using System.Diagnostics; 

ProcessThreadCollection threads = Process.GetCurrentProcess().Threads; 

をあなたは通常、Thread.Abort()を使用して管理スレッドを殺すことができますスレッドを探す

Remote Debugging Setup

3

。彼らがSleep、WaitまたはJoinに参加している場合は、Thread.Interrupt()を取り除くことさえできるかもしれません。

+0

残念ながら、それはProcessThreadのコレクションを返します。これはSystem.Threadと同じではありません。あなたが参照したメソッドはSystem.Threadにあります。 ProcessThreadからSystem.Threadに移動する方法がわかりません。 : - / –

関連する問題