2

私のウェブサイトでは、コントローラを使用して画像のサムネイルを生成しています。私のコードは次のようになります:

var filePath = getThumbnailPath(); 
if (!File.Exists(filePath) 
{
    ... create thumbnail  
}    
return new Filestream(...)

問題は、2 人のユーザーが同じサムネイルを要求し、これが作成されていない場合、作成時に例外が発生することです。オーバーヘッドをあまり導入せずに、ファイル名オブジェクトのロックを効率的に使用するにはどうすればよいですか?

Aristos のコメントの後にリファクタリングされたコード:

 Mutex m = new Mutex(false, originalImagePath);
 m.WaitOne();
 try
 {
     if (!File.Exists(originalImagePath))
     { 
          ... create thumbnail
     }
 }
 finally
 {
     m.ReleaseMutex();
 } 
4

2 に答える 2

3

サムネイルの作成を他のサービスに委任します。ユーザーは、サムネイルを作成するリクエストを作成します別のサービスがこのリクエストを消費し、実際の作業を行います。

サービスとは何か、自分で選ぶことができます。これは、WCF サービス、Windows サービス、メッセージ キューなどです。

ボトルネックが発生するため、ASP.NET Web サイトでロックを直接使用することは、通常はお勧めできません。

于 2012-08-08T18:27:54.207 に答える
1

ASP.NET サイトには、複数のプロセス (Web ファームなど) を実行できるという概念があります。 lock単一のプロセス内でのみロックします。何らかの理由でコードが複数のプロセスで実行された場合、同じ問題に戻ることになります。

また、辞書の使用はスレッドセーフにする必要があります。このままでは、同じファイル名に対して複数の値を書き込むことができます。

名前付きを使用することをお勧めしMutexます。これにより、プロセス間の相互排除が可能になります。ミューテックスの名前は、単にファイル名にすることができます。辞書は必要ありません。

別のサービスにネットワーク リクエストを行うと、サイトへのリクエストにさらに多くのレイテンシが発生したようです。(たとえば、サイトへの画像のリクエストでは、この「サービス」に対してセカンダリ ネットワーク リクエストを作成して画像を取得する必要があります。つまり、画像の場所を取得します)。

于 2012-08-08T21:01:17.337 に答える