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

У меня есть страница с кучей виджетов.Каждый виджет является представлением.Прямо сейчас рендеринг виджетов выполняется в цикле 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.

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

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

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

0 голосов
/ 05 августа 2010

Пол,

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

т.е.

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, либо напрямую, учитывая, что он асинхронный.

jim

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