Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Asp.Net Асинхронный обработчик HTTP для изменения размера изображения

Автор вопроса: KiranPalodeОтветов: 2

Я использую метод С # Image.GetThumbnail () для создания эскиза изображения. Мне нужно динамически генерировать этот эскиз. Мне нужно создать 100 эскизов для одного galleryId. Поэтому я добавил HttpHandler для динамического создания миниатюры. Проблема в том, что когда я щелкаю идентификатор галереи. На мой обработчик Http отправляется 100 запросов. Так что миниатюры загружаются очень медленно. У меня есть вопросы

  1. Могу ли я повысить производительность за счет реализации асинхронного обработчика HTTP? Я не знаком с асинхронным программированием на C #. Как я могу создать эскиз с помощью асинхронного обработчика HTTP?
  2. Есть ли альтернативный способ повысить производительность, чем модель асинхронного программирования? Я имею в виду добавить несколько обработчиков для обслуживания запроса, например

Может кто-нибудь мне помочь.

httphandler

Ответы

Ответ 1 · рейтинг 2 · Jakub Konecki

Другой способ решить эту проблему - это вообще избегать ее.

Создайте эскиз, когда изображение загружено, а затем просто предоставьте готовый эскиз с соответствующим установленным сроком действия содержимого.

Вы сэкономите довольно много времени на обработке и, что более важно, сдвинете ее во времени, поэтому, когда пользователи просматривают галерею, вы можете как можно быстрее отобразить эскиз.

Ответ 2 · рейтинг 1 · Aristos

Здесь вам нужно определить реальную причину задержки. Это потому, что вы вызываете его 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();
    }
}

Посмотрите, как сеанс блокирует страницы друг друга: Веб-приложение заблокировано при обработке другого веб-приложения при совместном использовании того же сеанса

Полная замена сеанса ASP.Net

тайник

Конечно, вам нужно кэшировать ваши эскизы на диск, а также установить кеш для изображений для браузера. Нет смысла создавать их снова и снова.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы