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

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

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

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


person KiranPalode    schedule 20.05.2012    source источник


Ответы (2)


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

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

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

person Jakub Konecki    schedule 20.05.2012
comment
Прости. У меня нет возможности загружать файлы. У меня есть каталог, который используется на сервере, откуда я беру изображения. Во-вторых, я должен создавать только динамические эскизы. Не могли бы вы поделиться своими идеями, если у вас есть лучшее решение для решения проблемы. - person KiranPalode; 21.05.2012

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

тайник

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

person Aristos    schedule 20.05.2012
comment
Нет, я не реализую IRequiresSessionState. Тогда нужно ли нам удалить сеанс? Как я могу удалить сеанс из моего обработчика Http? Когда я щелкаю идентификатор галереи, я получаю список из 100 URL-адресов изображений через ajax. Затем я установил src для атрибута 100 img с такими URL-адресами, например ‹img src = 'image.ashx? Url = imageurl' /› через javascript. image.ashx - это мой обработчик, который генерирует эскиз. Затем пропадает 100 запросов на создание миниатюр. Это мой сценарий. Как я могу реализовать метод мьютекса в моем обработчике. Пожалуйста помогите. - person KiranPalode; 20.05.2012
comment
@KiranPalode Хорошо, следующая мысль - добавить мьютекс. Начните с добавления одного мьютекса, который оставил только одну миниатюру, и посмотрите, улучшит ли это его. Создайте этот пример msdn.microsoft.com/en-us/library /system.threading.mutex.aspx, если вы этого не понимаете, скажите мне написать код - person Aristos; 20.05.2012
comment
На это уходит больше времени .. Он не показывает эскизы через долгое время. Я думаю, что реализация стала долгой задачей. Не могли бы вы поделиться точной идеей, что вы имеете в виду. - person KiranPalode; 21.05.2012
comment
@KiranPalode Тогда ваша проблема в том, что вы не кешируете миниатюры. Вы не можете ничего делать, кроме как кэшировать их. - person Aristos; 21.05.2012
comment
В ПОРЯДКЕ. Я могу добавить здесь механизм кэширования вывода, но проблема заключается в начальном запросе. После второго щелчка мышью мы можем получить преимущество кеширования. Но когда я нажимаю первый раз, мне нужно немного подождать. Я должен получить здесь лучшую производительность, т.е. Первая загрузка. - person KiranPalode; 21.05.2012
comment
@KiranPalode cache cache cache, на диске ... Я создаю более 100 thub на странице, но с кешем. Единственная задержка была в первые дни, когда были созданы миниатюры, затем новое изображение не добавляло столько накладных расходов ... очевидно, вы не кешируете / не сохраняете миниатюры на диск ... сохраните их, сделайте их кешем и ваш вопрос будет решен. - person Aristos; 21.05.2012