1

継続的に実行され、いくつかの作業を行うためにいくつかのスレッドを作成する Windows サービスがあります。これらのスレッドが適切に破棄されていることを確認したい (終了後に収集されたガベージ.

ただし、定期的に生きているかどうかを確認し、生きている場合は終了できるようにしたいと考えています。ただし、ガベージコレクションされないため、それらへの参照を保持できないことはわかっています。

ユーザー定義スレッドの存在/状態を確認する別の方法はありますか? を使用して次のようなことを考えていましたWeakReference:(今は完全にテストできないか、自分でテストするだけです)

List<WeakReference> weakReferences;
Thread myThread = new Thread(() => Foo());
WeakReference wr = new WeakReference(myThread);
weakReferences.Add(wr);  //adds a reference to the thread but still allows it to be garbage collected
myThread.Start();
myThread = null;  //get rid of reference so thread can be garbage collected

そして、私の onTimeElapsed イベントの開始時 (5 分ごとに実行):

foreach(WeakReference wr in weakReferences)
{
    Thread target = wr.Target as Thread;  //not sure if this cast is really possible
    if(target.IsAlive && otherLogic)
    {
         target.Abort();
    {
}

しかし、WeakReference がどのように機能するのか正確にはわかりません。これを適切に行う方法についてのアイデアはありますか?

4

2 に答える 2

6

myThreadメソッド変数ですか?また...?

ほとんどのシナリオでは、可能であれば、スレッド単純にガベージ コレクションされます。その時点では存在しないため、メソッド変数である場合に設定myThreadする必要はありません。nullmyThread

ただし、スレッドは実際にはかなり高価なオブジェクトであることに注意してください (スタックだけを割り当てるのは面倒です)。可能であれば、ThreadPool(各アイテムの存続期間が短い場合) または特注のワーク キュー (より長い場合) を使用することをお勧めします。複数のワーカーが 1 つのキューにサービスを提供する可能性があります。

スレッドの終了/中止に関しては...それは決して良い考えではありません。その時点でスレッドが何をしているのかわかりません。その後、プロセス全体が運命づけられる可能性があります。可能であればワーカーに「中止」フラグをときどきチェックさせることを検討してください。不可能な場合は、別のプロセスで作業を行うことを検討してください。プロセスはスレッドよりもさらにコストがかかりますが、分離されているという利点があります。自分に影響を与えずに殺すことができます。もちろん、作業中のファイルなどを破損する可能性があります...

率直に言って、私がスレッドを中止することを検討するのは、プロセスがすでに死んでいて、できるだけ早くプロセスを悲惨な状況から解放しようとしている場合です。

于 2012-06-27T19:32:23.643 に答える
2

スレッドプールを使用します。自分でスレッドを生成したり、ホイールを発明したりしないでください。

于 2012-06-27T19:31:55.010 に答える