2014-01-23 46 views
-1

我想計算系統在asp.net中使用C#執行特定操作所用的時間。當用戶點擊一個按鈕以獲得任何結果時,我必須顯示結果以及他們獲得結果所花費的時間。任何人都請告訴我必須提供的代碼以顯示所花費的時間。使用C#在asp.net中處理請求所花費的時間

+2

你是指在服務器端花費的時間(即在ASP.Net代碼中)?或者你的意思是用戶體驗的時間?後者將高度依賴於網絡延遲等,而不是ASP.Net#後端代碼。 – StevieB

+0

我需要計算服務器端所用的時間。 – user3229818

回答

6

如果您想測量某個操作需要多長時間,則可以使用StopWatch對象。下面的用法示例:

class Program 
{ 
    static void Main() 
    { 
    // Create new stopwatch 
    Stopwatch stopwatch = new Stopwatch(); 

    // Begin timing 
    stopwatch.Start(); 

    // Do something 
    for (int i = 0; i < 1000; i++) 
    { 
     Thread.Sleep(1); 
    } 

    // Stop timing 
    stopwatch.Stop(); 

    // Write result 
    Console.WriteLine("Time elapsed: {0}", 
     stopwatch.Elapsed); 
    } 
} 

所以你需要在你的情況做的是開始你的動作/法的執行時啓動秒錶並返回一個視圖/完成執行之前阻止它。然後,您可以使用stopWatch.Elapsed值將其顯示給用戶。

+1

+1。請注意,此處顯示的「Stopwatch」的基本用法只會衡量實際操作花費的時間,忽略服務器端的所有基礎架構代碼以及所有網絡時間/ JavaScript時間 - 因此總是小於用戶觀察的值。 –

+0

我完全同意阿列克謝。 –

0

原始海報指定ASP.Net。在ASP.Net做最簡單的方法可能是注入這樣的事情到您的global.asax

private static ILog log = log4net.LogManager.GetLogger(typeof(Global)) ; 

void Application_BeginRequest(object sender , EventArgs e) 
{ 
    Stopwatch timer = new Stopwatch(); 
    timer.Start(); 
    Request.RequestContext.HttpContext.Items["timer"] = timer ; 
    return ; 
} 

void Application_EndRequest(object sender , EventArgs e) 
{ 
    Stopwatch timer = (Stopwatch) this.Request.RequestContext.HttpContext.Items["timer"] ; 
    timer.Stop() ; 
    log.InfoFormat("HttpVerb={0}, URL={1}, elapsed time={2}" , 
    this.Request.RequestType , 
    this.Request.Url , 
    timer 
    ) ; 
    return ; 
} 

如果你想這樣做特定頁面的基礎上,你需要做同樣的事情,分別掛接Page.PreInit和Page.Unload事件。

而且您幾乎需要使用HttpContext來保持計時器的持續時間:如果您嘗試使用靜態變量,那麼您將擁有經典的競爭條件。

+0

此答案中提供的代碼不能保證能正常工作。 Stopwatch實例必須由啓動它的完全相同的線程停止,並且ASP.NET運行時可能會在BeginRequest和EndRequest方法之間跳轉線程。這可能會導致記錄不正確的值。 – Levi

+0

正常情況下,一個ASP.Net請求由單個工作線程處理。線程可能被更改的唯一上下文是如果您正在使用異步操作,這可能導致請求的工作線程切換。 (請參閱http://www.lhotka.net/WeBlog/PermaLink,guid,019e3c37-38ed-492e-b769-16e1a57fed0a.aspx和http://piers7.blogspot.fr/2005/11/threadstatic-callcontext-and_02。 html和http://forum.springframework.net/showthread.php?572-CallContext-vs-ThreadStatic-vs-HttpContext&highlight=LogicalThreadContext)。 –

+0

ASP.NET請求處理可以(並且經常!)跳轉線程。請記住:IIS和ASP.NET都在您的應用程序的BeginRequest和EndRequest事件之間運行代碼,並且不保證此代碼同步執行。由於這些事件中的IIS或ASP.NET代碼,可能會發生線程跳轉。有關更多信息,請參閱http://stackoverflow.com/questions/4791208/threadstaticattribute-in-asp-net。 – Levi

相關問題