3

アイテムをコンシューマー(C)にプッシュするプロデューサー(P)がいます。Cは、到着後すぐにすべてのアイテムを消費しないことを決定する場合があります。代わりに、キューにn個のアイテムがあるまで、または特定の時間間隔tが経過するまで非同期で待機してから、キュー内のすべてのアイテムを消費してタイマーを再起動する場合があります。

Pは、Cにプッシュしたアイテムが実際に消費されたときに通知を受ける必要があります。これは、障害が発生した場合の回復をPが担当するためです(Pは現在の状態をDBに保持します)。したがって、再起動の場合、Pは、消費者によって承認されていないため、どのアイテムを再度プッシュする必要があるかを知る必要があります。

私の最初のアイデアは、Cにコールバック関数(デリゲート)を介してPに通知させることでした。アイテムが消費されるたびに、消費されたアイテムのリストを使用してPのコールバック関数が呼び出されます。

しかし、プロデューサーに通知する他の(より良い)方法があるのではないかと思います。あなたの考えは何ですか?

ステファノ

更新:これまでの回答ありがとうございます。私は現在、非同期メソッドを使用することが、発行されているアイテムのステータスについて発行者と消費者を同期させるための洗練された方法であるかどうかを調査しています。

4

5 に答える 5

4

CからPに通知することなく、必要なことを達成できると思いますが、トランザクションキューを使用してCにフィードします.MSMQ実装について話しているリンクの例:

http://msdn.microsoft.com/en-us/library/ms978430.aspx、または MSMQ が利用できない場合、純粋な BCL ソリューションは次のようになります。

https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/branches/rhino-queues-1.0/ (または少なくともアイデアをつかむため)

編集 MSMQ ソリューションに関するより公式なリンクにリンクを変更しました。

于 2011-04-07T12:36:14.350 に答える
0

私は非同期設計を実装することになりました (つまり、プロデューサー/コンシューマー インターフェイスでBeginXXXEndXXXのペアのメソッドを作成します)。これは .NET 開発にとってより慣用的であると考えているためです (このコードの将来のメンテナーは慣れていると思います)。それと)。

コンシューマーがアイテムの処理を完了すると、パターンに従ってコールバックを呼び出します。クライアントは、コールバックで同期するか、 を介して他の対話パターンを使用できますIAsyncResult(MSDN ドキュメントを参照)。

于 2011-04-11T15:54:22.270 に答える