背景:私はすでにスレッドシステムが設計されているアプリケーションに取り組んでいます。最適とは程遠いですが、現時点ではやり直せません。.netの新しいスレッド構造は使用せず、基本Thread
オブジェクトとスレッド処理ロジックをラップするオブジェクトのみを使用します。
一般的な設定は次のとおりです。(現在、2つのグループ、またはスレッドのカテゴリがあります)
ワーカースレッドを生成するメインアプリケーションスレッド(statthread main)。
ワーカースレッド。それぞれに
Thread
オブジェクトがあり、すべての処理を行う/スレッド間の境界などを処理するワーカーオブジェクトがあります。各スレッドはジョブを実行し、各ジョブには。がありJobTypeID
ます。
ワーカーを制御するための3番目のタイプのスレッドを導入する必要があります。これらの制御メッセージは、awcf Webサービスから送信されます(したがって、このスレッドは暗黙的に処理されます)。
制御メッセージは次のとおりです。{一時停止/再開、IDのリスト}
私の目標:
スレッドがジョブを処理している場合に、このスレッドのすべてのジョブを一時停止するようにというメッセージが表示されるように、これらのスレッドを同期するための最良の方法を見つけようとしていますJobTypeID
。履歴書が送信されるまでブロックする必要があります(そのIDの場合) )。ここでの落とし穴は、メッセージが送信された時点で、関連するジョブが処理されていない可能性があるため、すぐにアクションを実行する必要がないことです。また、ワーカーオブジェクトのリストがないため、単純に処理することはできません。各ワーカーを繰り返し処理し、if-matches-then-pauseを実行します。
実際の質問(一般化) 一連のワーカースレッド、スポナー/マネージャースレッド、および一連の制御スレッドを同期するために、皆さんは何をお勧めしますか?
私が試したこと
1つのアプローチは、ManualResetEvent
オブジェクトのコレクションを1つずつ格納JobTypeID
し、着信メッセージに従ってそれらに信号を送り、待機することです。このアプローチについてどう思いますか?プロセスに100以上の待機ハンドルがある場合のベストプラクティスまたはメモリ/処理コストに関する情報が見つかりません。
別のアプローチは、すべてのスレッドが待機する単一のオブジェクトを持ち、その同期されたコレクションがJobTypeIDs
待機することです。私はこのアプローチでいくつかの問題を抱えています。ManualResetEvent
つまり、1つのジョブIDを再開しても、他のジョブIDが待機している場合は、set(); reset();を実行する必要があります。これにより、いくつかの競合状態が発生します(WaitHandle.SignalAndWait(x、x)を実行しようとしても))最後に、Monitor.PulseAll()を使用して機能するソリューションを考え出しました。
たくさんのロックオブジェクトを備えたモニターを使用することもできます。これは、たくさんのウェイトハンドルよりも軽量であるように思われます。
また、長い質問とお読みいただきありがとうございます!