Как я могу отображать действия MVC параллельно, чтобы уменьшить общее время рендеринга страницы? [asp.net-mvc, model-view-controller, parallel-processing]

Как я могу отображать действия 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)


arrow_upward
0
arrow_downward

Павел,

Существует класс 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

arrow_upward
2
arrow_downward

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

person Nick DeVore    schedule 05.08.2010