2

BlockingCollection を使用していくつかのファイルを処理し、サーバーにアップロードしています。

現在、ファイル システムを再帰的に処理し、特定のファイルを一時的な場所に圧縮する単一の Producer があります。ファイルの処理が完了すると、独自のオブジェクトが BlockingCollection に追加されます。このオブジェクトには、ファイル名、ファイル パス、変更日などの情報が含まれています。次に、コンシューマーはこのオブジェクトを取得し、それを使用してファイルをアップロードします。Producer は、ファイル システムの検索とファイルの操作を完了すると、BlockingCollection.CompleteAdding() メソッドを呼び出して、完了したことを Consumer に通知します。

私がやりたいことは、プロデューサーの数を 2 つ以上に増やすことです。その理由は、圧縮プロセスに時間がかかり、マルチコア プロセッサでは 1 つのコアしか利用していないためです。これにより、Producer は、より高速なネットワークで Consumer に遅れをとることがあります。

私の質問は、複数のプロデューサーと 1 つのコンシューマーしかない場合、すべてのプロデューサーが作業を終了したことをコンシューマーに通知するにはどうすればよいですか? プロデューサーの 1 つで BlockingCollection.CompleteAdding() メソッドを呼び出すと、1 つ以上の他のプロデューサーがまだ機能している可能性があります。

4

2 に答える 2

2

Producerを呼び出す前に、コードでセマフォを使用できますBlockingCollection.CompleteAdding()。セマフォはすべてのインスタンスで共有されProducer、最後のプロデューサーが終了すると、メソッドを呼び出すことができます。セマフォは単純なカウンターとして実装でき、プロデューサーが作成されたときにカウンターをインクリメントし、プロデューサーがジョブを終了したときにカウンターをデクリメントします。カウンターがゼロになると、BlockingCollection.CompleteAdding()を呼び出すことができます。

于 2012-02-08T15:02:24.720 に答える