ASP.Net 2.0頁面性能的考慮
一般情況下我們通常在一個頁面中,結合頁面事件處理模型,按順序一步一步的聲明各個處理過程。這就是所說的同步處理(Synchronous),我們可以很方便的定義頁面處理的順序。同步處理雖然很方便,但在耗時高請求處理的時候就會暴露嚴重的問題,在一個高並發的網站生產服務器上,由於.net處理是基於所謂的ThreadPool的,而Threadpool中的處理線程又是有限的,如果當前ThreadPool中的線程已經全部用盡,而後繼又有不斷的大規模請求的話,服務器的性能就會嚴重的下降,更嚴重的還會使服務器崩潰。所以我們關心最多的就是怎樣來更好的使用的.net ThreadPool。讓.Net更好的發揮的性能。
說到這就不得不談.net的異步處理(Asynchronous),模型一般為BeginXXX,EndXXX,BeginXXX返回一個IAsycResult對象,其中包含對當前異步操作的信息,而EndXXX用戶接受返回值,輸出參數。.net從ThreadPool中分配一個空閒線程給BeginXXX然後立即返回給ThreadPool,等到異步處理結束時,.net又從ThreadPool中分配一個空閒線程用於處理EndXXX方法。這樣就可能有足夠的線程用於處理其它的事情。見於篇幅問題這裡我們只談ASP.Net 2.0的異步處理模型,我們都知道在1.x的時候要很好的建立頁面的異步處理是比較麻煩的,可能微軟很早就認識到了這一點,所以在2.0的版本中引入的新的頁面處理模型,加入了方便的異步處理點(Asynchronous Point)在PreRender事件和PreRenderComplete事件之間,在這個異步點,頁面需要等待所有的異步處理都完成,所以可以在頁面呈現之前完成你需要的任何效果,極大簡化了建立異步頁面的方法。
首先你要在建立頁面的@page聲明中加入 Async="true",這是必須的。設置告訴ASP.Net要選用IHttpAsyncHandler來處理當前的頁面。接下來你需要做的一般是在Page_Load事件處理中使用異步處理過程,現在有兩種途徑:
第一種就是使用Page.AddOnPreRenderCompleteAsync方法來處理需要異步處理的Begin和End方法集.如下:
AddOnPreRenderCompleteAsync(new BeginEventHandler(MyBeginMethod),new EndEventHandler(myEndMethod));