2

スレッドセーフな「コマンド優先度キュー」にデータをエンキューする複数のプロデューサー スレッドがあります。

そして、この「コマンド プライオリティ キュー」のデータを常にチェックし、デキューし、必要な処理を行う「コマンド リーダー」コンシューマ スレッド。最終的には、各処理の後、コマンドを発行した正しいプロデューサー スレッドに結果を返す必要があります。

結果をエンキューするために別のスレッドセーフな「結果キュー」を用意することを考えていましたが、問題は、データを関連するプロデューサー スレッドにプッシュするにはどうすればよいかということです。

または、私が試すことができる他のエレガントなソリューション/メカニズムまたはアーキテクチャはありますか?

ありがとうございました。どんな助けでも大歓迎です。

4

1 に答える 1

1

私が通常行うことは、「OnCompletion」イベント (または Task クラスの OnCompletion 関数オーバーライド) を、スレッドのキューに入れられたデータ オブジェクトに追加することです。スレッドがデータの処理を終了すると、データ オブジェクトをパラメーターとして 'OnComplete' を呼び出します。元のプロデューサー スレッドは、OnComplete' イベント (またはオーバーライド メソッド) を、データ オブジェクトをキューに入れる前に関数が必要とするものに設定できます。

'OnCompletion' は、プロデューサー スレッドがタスクをキューに入れた後に待機するイベントを通知する (同期) か、タスク オブジェクトをプロデューサー スレッドのプライベート 'returnedData' ブロッキング キューにキューに入れることができます。プロデューサーがそれに近づくたびにキューから取り出されて処理されます(非同期)。

編集: データ/タスク オブジェクトには、例外および/または errorMessage メンバーを含める必要があります。これにより、スレッドでデータに問題が発生した場合、「OnCompletion」を呼び出す前に適切に設定できます。これにより、プロデューサー スレッドは何か問題があるかどうかを確認できます。

于 2013-04-16T09:48:05.903 に答える