Каков порядок выполнения C # в Razor? - PullRequest
0 голосов
/ 04 марта 2012

Я хотел бы понять, как механизм Razor выполняет код c #, запущенный с @.

Я пытался увидеть различные моменты времени, когда выполняется контроллер и выполняется представление.Итак, я создал это очень простое приложение ASP.NET MVC.Я сохраняю время в переменной ViewBag в контроллере и показываю ему представление, я также показываю текущее время в представлении.

Контроллер имеет это:

public ActionResult Index()
{
    ViewBag.ProcessingTime = DateTime.Now;
    return View();
}

Представление имеет это:

Processing time: @ViewBag.ProcessingTime<br />

    @{
        int i = 0;
        do
        {
            i++;
            <text>@i<br /></text>
        }
        while (i < 1000000);
        }

Render time: @DateTime.Now 

Результат примерно такой:

Processing time: 03/03/2012 04:16:48 p.m.
1
2
3
4
[...]
999998
999999
1000000
Render time: 03/03/2012 04:16:48 p.m.

Почему, если явно требуется время, чтобы показать мне веб-страницу во время выполнения if, значение ProcessingTime в Controller и RenderTime в представлении совпадают?

1 Ответ

4 голосов
/ 04 марта 2012

Помните, что страница отображается на сервере . Таким образом, даже если визуально вам это кажется очень медленно на клиенте (потому что вы отправляете огромный HTML), реальный рендеринг происходит на сервере, и, вероятно, это происходит менее чем за секунду, так как все, что вы делаете, - это цикл более 1 миллиона элементы.

Попробуйте показать тики процессора, и вы должны заметить разницу (а если нет, то должно быть что-то в корне неправильно):

Processing time: @ViewBag.ProcessingTime.Ticks

... your loops and stuff

Render time: @DateTime.Now.Ticks

Таким образом, фактическое выполнение выглядит следующим образом:

  1. Клиент запрашивает /home/index.
  2. Действие контроллера выполняется, сохраняет текущее время в ViewBag и начинает выполнение представления.
  3. Выполнение представления - это просто зацикливание и выгрузка элементов 1M в поток ответов, что происходит очень быстро, вероятно, менее чем за секунду. Поэтому, когда он достигает последней строки представления менее чем за секунду, эта последняя строка отправляется клиенту.
  4. Много времени (по сравнению с выполнением на сервере) занимает этот поток для достижения клиента.
  5. Много времени (по сравнению с выполнением на сервере) требуется клиенту для построения дерева DOM и его показа.
  6. Наконец клиент показывает состояние того, что было сгенерировано на сервере, что произошло довольно быстро.
  7. В вашем браузере вы наблюдаете довольно близкие времена, но между просмотром этой страницы в этом браузере произошло много времени.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...