0

Mutex を使用するか、セマフォを使用するか、またはその他の機能を使用するかがわかりません。

これが私のシナリオです。マルチスレッド環境では、あるイベントによりイメージがディスクに書き込まれます。この画像は、イベント ハンドラーで生成されます。

問題は、イベント A によって画像 A.png が書き込まれ、イベント B によって画像 B.png が書き込まれることです。

これらのイベントが同時に発生した場合、イメージを保存できますが (ただし、ディスクは並列書き込みをうまく処理できないことは明らかです)、これは有効なシナリオです。

ただし、イベント A が複数回発生する場合があります。これも有効ですが、同じファイル名に対して image.Save を呼び出すと、汎用 GDI エラーが発生します。

すべてのスレッドをロックせずに (lock キーワードを使用するなど) 機能を使用して .Save(...) 呼び出しをロックするにはどうすればよいですか?

ハンドラーがファイル名をルックアップ テーブルに書き込み、次にファイルを書き込む手作りのソリューションについて考えました。他のハンドラーは、ルックアップを確認してから、Thread.Sleep などを実行する必要があります。しかし、これはリソース ロックに対する単純なアプローチのように見えます。

「仮想」リソースをロックするようなカスタムロックの適切な方法はありますか? (ロック時に仮想として存在しない可能性があります)。

更新と編集: 画像生成ではいくつかの処理が実行されるため、タスクにラップされます。典型的なシナリオでは、Thread.Pool を利用するために常に複数のイメージを同時に作成します。ジョブ キューが問題を解決することはわかっていますが、並列実行は削除されます。手動でジョブを n スレッドに分散すると (つまり、独自のプールを作成することになりますよね?)、2 つのスレッドが同じファイルを書き込もうとするという問題が発生します。

イベント ソースは信頼できないため、同じファイルに対して書き込み操作を複数回呼び出す可能性がありますが、実際には、1 つの「イメージ A」世代が作業中であるか、まだ開始されていない限り、2 番目、3 番目、またはその他のイベント処理は無視できます。

4

2 に答える 2

2

マークの答えに加えて、クラスを使用できますBlockingCollection<T>。これは、生産者と消費者のパターンを実装します。ドキュメントの「」セクションのConsumingEnumerableDemoクラスを参照してください。

于 2013-10-01T16:38:01.760 に答える