2011-10-11 54 views
4

我做的激發Page_Unload事件的一些診斷日誌記錄在asp.net應用程序,這個記錄可能需要很長時間公平位(100ms左右)。響應流會被頁面卸載處理程序中的代碼阻擋嗎?我可以通過使用theadpool來異步執行我的工作,但是我寧願不會影響客戶端的響應時間。響應離開IIS後頁面卸載是否被調用?

的更多信息:

@thorkia是,該文件說,響應被髮送到客戶端後,激發Page_Unload被調用,但在我的測試(如建議由@steve)它確實正確塊。我已經試過Casini,IIS Express,完整的IIS 7.5(在測試服務器上),包含發佈和調試版本,無論是否附帶調試器。並且,抓住吸管,我試着在頁面指令中放入Async = true。我嘗試了Fiddler(啓用流媒體),沒有Fiddler。我試過用IE9和Firefox。如果文檔是「正確」的話,我不知道它確實發送響應,但也許沒有「完成它關閉」(什麼都意味着我需要檢查HTTP規範)等的頁面不呈現在瀏覽器?但我的理解是,客戶端瀏覽器開始呈現頁面,因爲它接收到的字節對我來說也沒有任何意義。我也試過在IL Spy中查看代碼,但我認爲這可能會花費我很多時間。

現在我很好奇;我做錯了什麼,或者是文檔誤導?

回答

3

爲什麼不試試呢?

protected void Page_UnLoad(object sender, EventArgs e) 
{ 
    System.Diagnostics.Debug.WriteLine("In Page_UnLoad"); 
    System.Threading.Thread.Sleep(10000); 
    System.Diagnostics.Debug.WriteLine("Leaving Page_UnLoad"); 
} 
+0

誠然,這是一個有點懶惰的我。我已經做了一些調查 - 並編輯了原始問題。 +1雙手拍打! –

+0

與數據已發送到客戶端之前的文檔相反。 –

2

根據MSDN後的數據已被髮送給客戶端(http://msdn.microsoft.com/en-us/library/ms178472.aspx)頁面卸載階段才調用。

花費很長的時間做你的記錄和清理,不會影響客戶的響應時間這一請求,但可能會影響將來的請求,如果大量的網頁正在等待卸載。

+0

在頁面卸載中寫入「Response」會引發異常。此外,正如thorkia所指出的那樣,阻塞請求線程進行日誌記錄可能會影響您的吞吐量(最終影響響應時間)。將工作卸載到線程池線程可能會做同樣的事情(因爲我相信ASP.NET請求線程也來自線程池)。從可擴展設計的角度來看,如果記錄時間比收集信息的時間長得多,那麼您可以將記錄卸載到由專用線程服務的單獨隊列中。 – VinayC

+0

我拿@史蒂夫的建議,它看起來像文檔是錯誤的。我將用我的發現來更新這個問題。 –