1

Producer タスクと Consumer タスクを使用してファイルを操作する非常に基本的なアプリケーションがあります。ここの例に基づいていますhttp://msdn.microsoft.com/en-us/library/dd267312.aspx

プログラムの基本は、Producer タスクがハード ドライブ上のファイルを列挙し、それらのハッシュ値を計算し、その他いくつかのことを行うことです。Producer がファイルの操作を完了すると、ファイルを Enques し、Consumer がそれを取得します。

Consumer タスクは、リモート サーバーに接続し、ファイルのアップロードを試行する必要があります。ただし、リモート サーバーに接続できないなどのエラーがコンシューマーで発生した場合は、実行中の処理を停止して終了する必要があることをプロデューサー タスクに通知する必要があります。サーバーがダウンした場合、またはダウンした場合、Producer が何千ものファイルを循環し続ける必要はありません。

BlockingCollection オブジェクトで .CompleteAdding() を使用して、Producer タスクから Consumer タスクにシグナルを送るサンプルをたくさん見てきましたが、生産を停止する必要があるというシグナルを Consumer から Producer に送信する方法がわかりません。

4

1 に答える 1

0

リターンキューを使用できます。アイテムの 1 つがエラー/例外を生成した場合、エラー データをロードしてプロデューサーに戻すことができます。プロデューサーは、新しいアイテムを生成する直前にリターン キューから TryTake() を実行し、返されたアイテムを適切に処理する必要があります。これは、実行するアクションを決定するために使用できる拡張エラー情報をアイテムが返すことを可能にすることで、アトミックブール値を使用するよりも優れています。プロデューサーは常に停止したい/必要があるとは限りません。また、エラーが発生した項目を GUI リストやロガーのキューに入れることもできます。

いつでも新しいアイテムを作成する代わりに再利用できるように、エラーがあるかどうかに関係なく、消費者はアイテムを返す必要があると言いたくなるかもしれません。ただし、2 つのリターン キューを使用してエラーのリターンに優先順位を付けない限り、エラーの検出/対処にレイテンシが発生します。

ああ、別のことですが、上記の設計を使用すると、停止する必要がある場合、プロデューサーはエラーが発生したアイテムをローカルキューに保持し、ときどき再発行することができます。サーバーが復旧した場合 (正常なアイテムが返されることで示されます)、プロデューサはローカル キューからエラー ジョブを再発行してから、新しいジョブを生成することができます。注意してください。これにより、アップロード システムがサーバーの再起動に対して回復力を持つようになる可能性があります。

于 2012-01-25T15:01:13.590 に答える