背景: 私は既にスレッドシステムを設計しているアプリケーションで作業しています。最適ではありませんが、現時点では修正できません。これは、.netの新しいスレッディングコンストラクト、基本的なThread
オブジェクト、およびスレッド処理ロジックをラップするオブジェクトを使用しません。複数のスレッドを.netで同期する
それの一般的なセットアップは、次のとおりです。ワーカースレッドを生成します
メインアプリケーションスレッド(メインstatthread)(二つのグループ、または今のスレッドのカテゴリがあります)。
ワーカースレッド。各スレッドには
Thread
オブジェクトがあり、すべての処理を行い、スレッドなどの境界を処理するワーカーオブジェクトがあります。各スレッドはジョブを実行し、各ジョブはJobTypeID
です。
第3の種類のスレッドを導入する必要があります。これは、作業者を制御するためのものです。これらの制御メッセージは、wcf Webサービスから来ます(したがって、このスレッドは暗黙的に処理されます)。
制御メッセージは、次のとおりです。{一時停止/再開、リスト-の-IDは}
私の目標:
私はそのようにこれらのスレッドを同期させるために何を最善の方法を把握しようとしていますスレッドがジョブを処理しており、このJobTypeID
のすべてのジョブを一時停止するというメッセージが表示された場合は、そのIDの再開が送信されるまでブロックされます。ここでのキャッチは、メッセージが送信された時点では、関連するジョブが処理されない可能性があるため、即座のアクションを実行する必要はなく、ワーカーオブジェクトのリストもないため、単純に各作業者を繰り返し処理し、if-matches-then-pauseを実行します。
実際の質問(一般) 君たちは私がワーカースレッドのセット、産卵/マネージャスレッド、および制御スレッドのセットを同期させるために何を勧めますか?
物事私が試した
一つのアプローチはManualResetEvent
オブジェクト、JobTypeID
あたり1のコレクションを格納するだろう、と信号と受信したメッセージに応じてそれらを待つように。このアプローチについてどう思いますか? 1つのプロセスで100以上の待機ハンドルを持つためのベストプラクティスまたはメモリ/処理コストに関する情報は見つかりません。
もう1つの方法は、すべてのスレッドが待機する単一のオブジェクトと、待機する必要があるJobTypeIDs
という同期化されたコレクションを持つことです。私はこのアプローチにいくつか問題がありました。 ManualResetEvent
を使用すると、あるジョブIDを再開しても他の人が待機している場合、set(); reset();を実行する必要があり、これによってWaitHandle.SignalAndWait(x、x ))最後に、動作するMonitor.PulseAll()を使用したソリューションを思いつきました。
ロックオブジェクトがたくさんあるモニターを使用することもできます。これは、たくさんのウォーターサンダーよりも軽量であるようです。
また、長い質問と読んでいただきありがとうございます!
いくつかの質問: 1.すべてのワーカースレッドが単一JobTypeIdの責任ですか?または、すべてのスレッドは利用可能なものを処理しますか?一時停止メッセージが受信されると、あるスレッドの処理ジョブを完全に一時停止するか、一時停止したジョブをスキップして他の処理を続行する必要がありますか? 2.ワーカースレッドはいくつありますか? 3.一時停止メッセージが受信されたときにワーカースレッドがジョブを処理する場合、ジョブを終了させたり、途中で何とか一時停止させたりしますか? – ttil