Как я могу отображать действия MVC параллельно, чтобы уменьшить общее время рендеринга страницы?

У меня есть страница с кучей виджетов. Каждый виджет представляет собой представление. Прямо сейчас рендеринг виджета выполняется в цикле foreach.

public class WidgetCollection : List<Widget>, IPersonalizable
{
    public void Render(HtmlHelper html)
    {            
        foreach (Widget w in this)
        {

            html.RenderAction("Default", "Widget", new { model = w });
        }
    }

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

Одна из идей, которые у меня были, состояла в том, чтобы вызвать html.Action(), чтобы получить строковое значение для каждого действия параллельно, но MVC, похоже, не любит параллельный рендеринг представлений. Я всегда получаю сообщение об ошибке «Объект не установлен в экземпляр объекта», когда пытаюсь это сделать. Ошибка возникает глубоко в стеке MVC, поэтому я думаю, что это просто ошибка MVC.

У кого-нибудь есть лучшая идея для увеличения скорости рендеринга страницы?


person Paul Mendoza    schedule 05.08.2010    source источник


Ответы (2)


Павел,

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

i.e.

public abstract class BaseController : AsyncController

эта ссылка может пролить дополнительный свет: http://msdn.microsoft.com/en-us/library/ee728598.aspx

или этот: http://bartwullems.blogspot.com/2010/01/using-asynccontroller-in-aspnet-mvc-2.html

Затем вы будете использовать его либо с ajax, либо напрямую, учитывая, что он асинхронный.

Джим

person jim tollan    schedule 05.08.2010
comment
Асинхронный метод работает только в том случае, если на вашем сервере заканчиваются потоки, и вам нужно высвободить больше, чтобы выполнить работу. Это не увеличивает скорость рендеринга одного запроса. - person Paul Mendoza; 05.08.2010
comment
Павел - спасибо за это. Я никогда не осознавал этого факта. своего рода делает асинхронность реальным пограничным случаем для большинства веб-сайтов. я предположил, что он породил «анимированную» группу потоков для обслуживания очереди запросов, а не продолжил работу по секвенированию с использованием существующего потока. интересные вещи. я должен исследовать это немного больше и, возможно, даже реорганизовать кучу моего кода в результате :) - person jim tollan; 06.08.2010

Можете ли вы использовать области и «заполнять» их через ajax?

person Nick DeVore    schedule 05.08.2010