1

C# メソッド Image.GetThumbnail() を使用して画像のサムネイルを生成しています。このサムネイルを動的に生成する必要があります。1 つの galleryId に対して 100 個のサムネイルを生成する必要があります。そこで、サムネイルを動的に生成するために HttpHandler を追加しました。問題は、ギャラリー ID をクリックしたときです。Http ハンドラーに 100 件のリクエストが送信されます。そのため、サムネイルの読み込みが非常に遅くなります。いくつか質問があります

  1. Asynchronous Http Handler の実装でパフォーマンスを向上させることはできますか? 私は C# での非同期プログラミングに慣れていません。Http Asynchronous Handler を使用してサムネイルを生成するにはどうすればよいですか?
  2. 非同期プログラミング モデルよりも優れたパフォーマンスを得る別の方法はありますか? つまり、リクエストを処理するための複数のハンドラーを追加するということです

誰でも私を助けてください。

4

2 に答える 2

2

この問題を解決する別の方法は、最初から回避することです。

画像がアップロードされたときにサムネイルを生成し、コンテンツの有効期限が適切に設定された準備完了のサムネイルを提供します。

かなり多くの処理を節約できます。さらに重要なことは、処理を時間内にシフトすることです。これにより、ユーザーがギャラリーを表示しているときに、できるだけ早くサムネイルを提供できます。

于 2012-05-20T12:38:44.527 に答える
1

ここで、遅延の実際の問題を定義する必要があります。同時に100回呼び出すためですか、それともハンドラーがセッションロックによってブロックされているためですか?

したがって、最初に考えるのは、ハンドラーからセッションを削除することです-使用する場合。

第二に、問題が何度も一緒に呼び出すためである場合はmutex、簡単なトリックを使用してこれを制限できます。ハンドラーをロックして、を使用して6つのサムネイルを同時に作成することのみをシミュレートできますmutex

これは、ミューテックスを使用し、同時にnスレッドを実行するために残すことができる単純なコードです。

static var random = new Random(DateTime.Now.Ticks);

public void ProcessRequest_NoCatch (HttpContext context) 
{
    // here we made names like ThubNum_0, ThubNum_1, ThubNum_2 ... ThubNum_4
    //  with 4 you have average 4 simulated thubs
    string sMyMutexName = string.Format("ThubNum_{0}", random.Next(0, 4))

    var mut = new Mutex(true, sMyMutexName);

    try
    {   
        // Wait until it is safe to enter.
        mut.WaitOne();

        // here you create your thubs
    }
    finally
    {
        // Release the Mutex.
        mut.ReleaseMutex();
    }   
}

セッションが他のページをブロックする方法を確認してください: 同じセッションを共有しているときに別のWebアプリを処理しているときにWebアプリがブロックされました

ASP.Netのセッションを完全に置き換える

キャッシュ

当然のことながら、サムネイルをディスクにキャッシュし、ブラウザの画像のキャッシュも設定する必要があります。それらを何度も作成する理由はありません。

于 2012-05-20T12:34:58.140 に答える