Используйте AJAX или многопоточность для ускорения загрузки страницы - PullRequest
5 голосов
/ 30 января 2011

У меня есть страница с 5 разделами. Для рендеринга каждого раздела требуется около 1 секунды.

Page_Load()
{
   RenderSection1();  //1 sec
   RenderSection2();  //1 sec
   RenderSection3();  //1 sec
   RenderSection4();  //1 sec                  
   RenderSection5();  //1 sec
}

Я бы хотел ускорить загрузку этой страницы. Но в то же время убедитесь, что это не замедляет работу других частей веб-приложения, а также не приводит к сбою IIS.

Существует несколько подходов:

  1. Использовать запросы AJAX. Должен быть запросом в стиле MVC к контроллеру или веб-службе.
    Использование UpdatePanel вокруг каждого раздела не будет работать - поскольку, если я попытаюсь отправить обновления нескольким UpdatePanel одновременно, используя подход, описанный здесь: http://encosia.com/2007/07/13/easily-refresh-an-updatepanel-using-javascript/, последний запрос всегда победит: http://www.codeproject.com/Tips/57035/Simultanious-Async-Requests-Using-Multiple-Update-.aspx

  2. Использовать потоки ASP.NET, описанные в ответе на правильный способ создания потока в веб-приложении ASP.NET . Поэтому я бы использовал отдельный поток для каждого вызова: RenderSection1, RenderSection2 и т. Д. ...

  3. Переместите логику, которая занимает много времени, обычно запросы БД, в класс службы приложений в другой DLL или внешней веб-службе. Что-то вроде

OrderDTO GetDataForViewOrder(int orderID)
{
}

и использовать несколько потоков в этой DLL. Кажется, что этот подход обеспечивает лучшую масштабируемость, но также вводит детали пользовательского интерфейса в уровень Application Services.

Какой подход вы считаете лучшим и почему?

Ответы [ 3 ]

2 голосов
/ 30 января 2011

Хотя потоки могут помочь с загрузкой одной страницы (при условии, что на вашем сервере есть как минимум 5 ядер ЦП), это не масштабируемый подход.Что, если в приложение одновременно войдут 3 пользователя?Тогда вам потребуется 15 ядер на сервере для достижения повышения производительности.

AJAX может быть решением, но он страдает от тех же проблем масштабируемости, потому что каждый запрос AJAX будет иметь свой собственный поток.С другой стороны, AJAX дает заданное улучшение скорости для конечного пользователя, потому что он может видеть, что что-то загружается, даже если отстающие части страницы занимают одно и то же время.попадание происходит из базы данных асинхронных запросов к базе данных.Вы можете запустить 5 асинхронных вызовов для 5 частей страницы и сократить время загрузки потенциально до 5 раз.Это сделает код более сложным, хотя.Кроме того, если вы решили объединить это с подходом AJAX, вам нужно взглянуть на асинхронные страницы ASP.NET или асинхронные службы WCF, чтобы избежать проблем с масштабируемостью при большом количестве пользователей, поскольку каждый пользователь займет 5 потоков.1006 * Код для асинхронных вызовов будет выглядеть примерно так:


Page_Load()  
{
     BeginDBRequest1();
     BeginDBRequest2();
     BeginDBRequest3();
     BeginDBRequest4();
     BeginDBRequest5();
     data1 = EndDBRequest1();
     data2 = EndDBRequest2();
     data3 = EndDBRequest3();
     data4 = EndDBRequest4();
     data5 = EndDBRequest5();

     //all of the above calls take the time of the max time call and not the sum of the times

     RenderSection1(data1);  //1 sec
     RenderSection2(data2);  //1 sec
     RenderSection3(data3);  //1 sec
     RenderSection4(data4);  //1 sec
     RenderSection5(data5);  //1 sec  
} 
2 голосов
/ 30 января 2011

Аякс.

Многопоточность мало помогает, так как вся страница должна ждать завершения всех нитей.И вряд ли сам ASP.NET требует времени.Более вероятно, что это ваша база данных или что-то еще.Потоки также добавят сложности вашему приложению, не получая от него многого.Используйте только потоки в веб-приложениях для выполнения задач обслуживания, и все остальное можно решить с помощью ASP.Net.

Используя ajax, мы быстро вернем главную страницу, и все разделы будут отображены, как только они получатрезультат обратно из запроса AJAX.

1 голос
/ 30 января 2011

Один из вариантов - использовать асинхронную загрузку страницы.Но это все в обработке на стороне сервера.По сути, вы регистрируете эти задачи для асинхронного выполнения и ожидаете их завершения .Поэтому отправляемый http-запрос будет ожидать завершения всех задач.

Второй вариант - ajax.Преимущество здесь в том, что страница загружается быстро.Однако он не работает с панелями обновления.Пойдите для понятия классического ajax, а не asp.net ajax.Использование библиотек, таких как jQuery, очень поможет.Вы можете сделать ajax-вызовы во все пять разделов после загрузки страницы.Вам придется написать код для возврата контента для всех этих 5 разделов.

Конечно, в идеале запросы ajax имеют смысл, если URL-адреса выполнены в стиле mvc.Но, на мой взгляд, обработчики asp.net очень близко подходят к этим запросам в стиле mvc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...