私はカスタムコレクション(スレッドセーフObservableQueue)を持っています。私は、コレクション・クラス内でビジネス・ロジックを実装しました(つまり、アイテムを1つずつデキューして外部に公開します)。これはうまくいきます。コレクションが初期化されたスレッドをブロックしないようにするため、OnservableQueueはスレッドを実装してその作業を実行します。今私は起こる可能性のある落とし穴を完全には確信していません。コレクションに含まれるスレッドの作成と終了
コンストラクタ内のスレッドを初期化する(初期化しないで初期化する)のは良い考えですか?スレッドを終了させるのは、ベストではないにしても、何がよいでしょうか?スレッドを終了する方法を知っておく必要はありません。それはうまく動作しています。私はむしろ天気に興味があり、使い捨てパターンを使用したり、スレッドを終了するために呼び出す必要があるメソッドを作成したりしています。 IDisposable
を実装する場合、コレクション/キューに関して考慮する必要があることはありますか?
編集:スレッドが実際には、それが適切に再びinitilisedさエンキュー方法、でスローされることからNullReferenceException
を防ぐために、初期化事前れる(エンキュー方法をデキュースレッドがすでにしている場合実行されている天気予報をチェックすることになっています新しいものを開始しないようにする)。すべてのアイテムがデキューされ、スレッドが処理を完了した時点でも、それはもう存続しないので、キューが空で新しいアイテムが追加されると、キューを処理する新しいスレッドが開始されます。
if (!_dequeuingThread.IsAlive)
{
// start the dequeuing thread
_dequeuingThread = new Thread(new ThreadStart(StartDequeuing));
_dequeuingThread.Name = "DeQueueThread";
_dequeuingThread.Start();
}
if文には初期化されたスレッドが必要です。これを達成する他の方法もありますが、スレッドをあらかじめ初期化するのが最も煩わしいようでした。気象をチェックした後、スレッドが生きていることがわかります。スレッドは事前に初期化されていてはなりません。正しく初期化されます。
ワーカースレッドは、キュー内の項目を反復処理するタイトループで実行されています。そのループで、私は揮発性ブールの真理値をチェックします。そして、それはループを繰り返すか、生きていないかです。あなたは実際にどこにフラグを設定しますか?メソッド( 'StopDequeuing()')や 'IDisposable'を実装していますか?個人的には両方とも –
です。私は、フラグを設定し、ワーカースレッドが終了するのを待つStopDequeuing()関数を持っていて、StopDequeuing()を呼び出すDispose()実装を持っています。 – GazTheDestroyer