私のサービス (複数のスレッドを使用する) の多くで、スレッド ID の値が増え続けていることに気付きました。これはトラブルの兆候ですか?どういうわけかそれらをプールに戻していないのですか、それともこの値は通常の動作を増加させますか?
2 に答える
スレッドが返されている (ブロック、待機、スリープ、または無限ループに陥っていない) 限り、問題はありません。ManagedThreadId は単なる一意の識別子であり、「スレッド数」ではありません ( http://msdn.microsoft.com/en-us/library/system.threading.thread.managedthreadid.aspx )
Thread.ManagedThreadId
このマネージド スレッドの一意の識別子を表す整数。
スレッドが戻ってきたことを確認するには、VS デバッガーでプロセスを一時停止し、すべてのスレッドをフリーズするように指示して、[スレッド] デバッグ ウィンドウを確認します。ランタイム環境では、スレッドコードを変更して、ロックされた整数をインクリメントし、スレッドが戻ったときに同じロックされた整数をデクリメントします (try/finally ブロックを使用して、スローされた例外によって整数のデクリメントが失われないようにします)。 .
「正しい」答えはノーです。それは正常ではありません。CLRが壊れているわけではありません。アプリでは (ほとんどの場合、非常に正当な理由がない限り、それが何であるか想像もできません)、スレッド スレッドを慎重に使用する必要があります。他の 100 個のスレッドを作成している場合、99% は何か間違ったことをしています。
スレッドを再利用する必要があるスレッドを強制終了するか、スレッド スレッドを使用しているスレッド プール スレッドを使用する必要があります。
編集OK。あなたは私を信用しないかもしれません。しかし、MSDN は同じことを言っています。
共通言語ランタイムをホストするアンマネージ コードがスレッドをファイバーとして実装している場合でも、ManagedThreadId プロパティの値は時間の経過とともに変化しません。
したがって、もう一度強調します (最初の試行では明確にしていませんでした)...既存のスレッドでスレッド ID が変更されていることはありません。さまざまなスレッドがポップアップ表示されます (自分の言葉で数百単位)... 新しいスレッドは新しい ID を取得します。古いスレッドは ID を変更しません。