Где запустить секундомер и где он должен остановиться?

Логичным местом для запуска секундомера должен быть метод действия контроллера, да, нет?

Но где должны останавливаться часы? Я хотел бы думать, что это идет в конце мастер-страницы? Нет смысла останавливать часы в конце метода действия контроллера, потому что в представлении будет выполняться дополнительный процесс для отображения страницы.

Любые мысли?

РЕДАКТИРОВАТЬ: я намерен использовать прошедшее время на главной странице, чтобы я мог получить время для любой веб-страницы.

Дарин: Спасибо за пример кода. Но образец не работает, как я ожидал. Я планировал использовать прошедшее время на главной странице, чтобы его можно было записать на каждую страницу.

Итак, я думаю, что главная страница уже будет загружена к моменту выполнения EndRequest?

В моем EndRequest я установил:

Context.Items["PageCreationTime"] = watch.ElapsedMilliseconds.ToString(); 

Тогда я не могу получить ссылку на свою мастер-страницу:

<%= HttpContext.Current.Items["PageCreationTime"].ToString()%>
1
Th3Fix3r 7 Июл 2009 в 12:07

2 ответа

Application.BeginRequest и Application.EndRequest являются хорошими кандидатами.

protected void Application_BeginRequest(object sender, EventArgs e)
{
    Stopwatch watch = Stopwatch.StartNew();
    Context.Items["watch"] = watch;
}

protected void Application_EndRequest(object sender, EventArgs e)
{
    Stopwatch watch = (Stopwatch)Context.Items["watch"];
    watch.Stop();
    // Do something with the results like for example:
    Context.Response.Write(watch.ElapsedMilliseconds);
}
4
Darin Dimitrov 7 Июл 2009 в 12:49
Хорошее предложение, но как мне получить значение прошедшего времени из глобального класса? Если я объявлю статическую переменную для секундомера, тогда это не будет потокобезопасным?
 – 
Th3Fix3r
7 Июл 2009 в 12:34
Вы должны сохранить его в HttpContext. Таким образом, это будет per/request и потокобезопасно.
 – 
Darin Dimitrov
7 Июл 2009 в 12:46
Нет, это не работает с главной страницей asp.net. Я думаю, что к моменту запуска EndRequest страница msaterpage уже отобразилась.
 – 
Th3Fix3r
7 Июл 2009 в 19:08
К тому времени, когда вы вызываете EndRequest, представления завершают рендеринг. Таким образом, выполнив Context.Response.Write(watch.ElapsedMilliseconds), вы можете добавить его после тега . Если вам нужно вставить его в определенное место внутри вашего html, вы можете написать собственный Filer ( aspnet.4guysfromrolla.com/articles/120308-1.aspx)
 – 
Darin Dimitrov
7 Июл 2009 в 19:34

Я думаю, вам лучше всего поместить его в обработчик событий EndRequest в файле Global.asax. Что-то типа:

protected void Application_EndRequest(object sender, EventArgs e)
{
  Stopwatch.Stop();
}

Событие EndRequest запускается в самом конце запроса поиска. Вы можете запустить свой секундомер в обработчике события beginrequest:

protected void Application_BeginRequest(object sender, EventArgs e)
{  
  Stopwatch.Start();
}

Запуск его в действии контроллера может быть слишком поздним (в зависимости от того, что вы хотите измерить), поскольку в этот момент будет запущено много другого кода, даже собственный код, который вы написали сами, например. когда вы размещаете пользовательские атрибуты в своем действии контроллера.

3
Razzie 7 Июл 2009 в 12:13
Спасибо, но как мне добраться до секундомера «Прошедшее время» из Global.ascx?
 – 
Th3Fix3r
7 Июл 2009 в 12:29
1
Дарин уже обновил свой ответ, так что посмотрите на его код. Если подумать, не лучше ли использовать настоящий инструмент для профилирования, такой как Antz от RedGate или dotTrace от JitBits? Эти инструменты великолепны и гораздо удобнее и надежнее, чем возиться с секундомером. Просто идея!
 – 
Razzie
7 Июл 2009 в 13:17