2012-01-25 8 views
1

プロデューサタスクとコンシューマタスクを使用してファイルを操作するかなり基本的なアプリケーションがあります。ここの例に基づいていますhttp://msdn.microsoft.com/en-us/library/dd267312.aspxBlockingCollectionを使用してコンシューマタスクからプロデューサタスクを通知する

プログラムの基本は、Producerタスクがハードドライブ上のファイルを列挙し、ハッシュ値を計算し、その他いくつかのことを実行することです。プロデューサがファイルの処理を終了すると、ファイルを取り込み、コンシューマがそれを取得します。

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

私は、BlockingCollectionオブジェクトで.CompleteAdding()を使用してProducerタスクからConsumerタスクを通知するサンプルをたくさん見てきましたが、消費者からProducerにシグナルを送信する方法については迷っています生産する。

答えて

0

リターンキューを使用できます。いずれかの項目でエラー/例外が発生した場合は、エラーデータとともにロードしてプロデューサにキューに戻すことができます。プロデューサは、新しい項目を生成する直前にリターンキューからTryTake()を呼び出し、返された項目を適切に処理する必要があります。これは、何らかのアトミックブール値を使用してビートします。これにより、アイテムは、どのアクションを取るべきかを決定するために使用される拡張エラー情報を返信することができます。また、エラーの発生したアイテムをGUIリストやロガーに格納することもできます。

消費者は、エラーがあってもいなくても、いつでも新しい商品を作成できるように商品を返却しなければならないと納得しています。ただし、エラーリターンを優先させるために2つのリターンキューを使用しない限り、エラーの検出/処理には待ち時間があります。

オハイオ州 - 別のもの - 上記のデザインを使用して、停止する必要がある場合、プロデューサは、エラーの発生したアイテムをローカルキューに保持して時折再発行することができます。サーバが正常に復帰した場合(正常終了)、プロデューサはエラーが発生したジョブをローカルキューから再発行してから、新しいジョブを生成することができます。注意することで、アップロードシステムをサーバの再起動に耐えられるようにすることができます。

+0

私はあなたを正しく理解していれば、エラー条件を含む2番目のBlockingCollectionを作成し、次にその上でTryTakeを使用しますか? – forcedfx

+0

はい。キューに入れられたアイテム全体をキューに戻します。生成される可能性のあるエラーデータを保持するために、いくつかの余分なデータメンバーを与えます。消費者から返送された場合は、ファイル仕様、ホスト名、消費者に最初に送ったものとエラーデータ(エラー番号/列挙型、テキストエラーメッセージなど)が含まれます。これにより、エラーを記録/表示したり、後でやり直したりすることができます(エラー情報をクリアし、再び消費者にキューイングさせます)。 –

関連する問題