2011-10-20 11 views
0

私はカスタムコレクション(スレッドセーフ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文には初期化されたスレッドが必要です。これを達成する他の方法もありますが、スレッドをあらかじめ初期化するのが最も煩わしいようでした。気象をチェックした後、スレッドが生きていることがわかります。スレッドは事前に初期化されていてはなりません。正しく初期化されます。

答えて

0

コンストラクタの初期化で何か問題はありませんが、ワーカースレッドとは別のスレッドで初期化されることに注意してください。

停止に関しては、私は一般的にワーカーが実行を継続するためにチェックする揮発性ブールフラグを持っています。ワーカースレッドがまったくスリープしている場合は、スリープ状態ではなくイベントで待機するようにしてください。停止するとすぐにスリープ状態に入ることができます。

+0

ワーカースレッドは、キュー内の項目を反復処理するタイトループで実行されています。そのループで、私は揮発性ブールの真理値をチェックします。そして、それはループを繰り返すか、生きていないかです。あなたは実際にどこにフラグを設定しますか?メソッド( 'StopDequeuing()')や 'IDisposable'を実装していますか?個人的には両方とも –

+0

です。私は、フラグを設定し、ワーカースレッドが終了するのを待つStopDequeuing()関数を持っていて、StopDequeuing()を呼び出すDispose()実装を持っています。 – GazTheDestroyer

0

コンシューマーがコンストラクターを呼び出すことによってこのコレクションオブジェクトを初期化し、オブジェクトが初期化されていると考えられる(コンストラクターが何をするか)という問題があるようですが、初期化はコンストラクタによって作成された別のスレッドで行われます。したがって、コンシューマがコンストラクタを使用してオブジェクトを作成した後にコンシューマがinitializeメソッドを呼び出し、次にinitializeメソッドにコールバックを渡すか、またはコンストラクタを使用してコンストラクタを呼び出すように、このコレクションを初期化するために、コレクションオブジェクトのイベントに登録することによって、コンシューマは、初期化が完了したことを知る。

+0

実際には、スレッドはコンストラクタでのみ初期化されるため、後で 'Thread.IsAlive'を呼び出すと' NullReferenceException'がスローされません。実際のスレッドが_started_される前に、正しく初期化されます。これは、以前のデキュースレッドが作業を終えていて、もはや実行されていない場合に実行する必要があるためです。'INotifyCollectionChanged'インターフェースと' Dispatcher'を実装するスレッドセーフなObservableQueueとは別に、それはOKを初期化し、それがバインドされているものを完全に更新します:)スレッドが実際にどのように初期化されたかについて上記の編集を参照してください。 –

関連する問題