2012-03-03 3 views
-1

Я хотел бы понять, как работает механизм Razor с кодом C#, начинающимся с @.Каков порядок выполнения C# в Razor

Я пытался увидеть разные времена, когда контроллер выполнен и представление выполнено. Итак, я создал это очень простое приложение 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 ProcessTime в контроллере и t он RenderTime в том же?

+0

@AndrewBarber - Требуется время, чтобы нарисовать все миллионы строк текста. –

+3

@TravisJ В этом коде нет «рисунка». –

+0

@ Andrew Я думал, потому что для отображения мне страницы требуется много времени. Теперь я понимаю, что задержка связана с браузером. Не показывайте ничего, кроме использования большего числа, я могу видеть разные времена. Благодаря! –

ответ

4

Помните, что страница отображается на сервере. Так что даже если это визуально для вас на клиенте очень медленно (потому что вы отправляете огромный 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. В вашем браузере вы наблюдаете довольно близкие времена, и все же между этим рендерингом страницы в этом браузере произошло много времени.
+0

Требуется некоторое время, чтобы нарисовать все миллионы текстовых полей. –

+2

@TravisJ, этот рисунок происходит ** на клиенте **. Вот почему он медленный. Фактический код выполняет ** на сервере **. Там огромная разница. Время, прошедшее между двумя измерениями DateTime на сервере, очень мало. –

+3

@TravisJ Сервер не «рисует» что-либо. Это просто демпинг данных в буферный поток. Это происходит очень быстро * –

Смежные вопросы