ASP.NET 2.0頁面性能的考慮
2006/12/6 8:11:31
一般情況下我們通常在一個頁面中,結合頁面事件處理模型,按順序一步一步的聲明各個處理過程。這就是所說的同步處理(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));
  通過添加上面的方法后,頁面執行通常的生命周期事件直到頁面的PreRender事件觸發.然后Asp.net調用先前在AddOnPreRenderCompleteAsync中的注冊的Begin處理程序。通常在Begin處理程序中處理的是一些異步的web服務,IO以及SQL的處理,這樣就可以極大的緩解.net線程池的壓力。例如:

    <%@ Page Async="true" Language="C#" %>
<asp:Content ID="Content" ContentPlaceHolderID="Main" Runat="server">
<asp:Label ID="Output" Runat="server"></asp:Label>
</asp:Content>

public partial class AsyncPage : System.Web.UI.Page
{
 private WebRequest m_Request;

 void Page_Load (object sender, EventArgs e)
 {
  AddOnPreRenderCompleteAsync (
   new BeginEventHandler(BeginAsyncOperation),
   new EndEventHandler (EndAsyncOperation)
  );
 }

 IAsyncResult BeginAsyncOperation (object sender, EventArgs e, AsyncCallback cb, object state)
 {
  m_Request = WebRequest.Create("http://www.dofor.cn");
  return m_Request.BeginGetResponse (cb, state);
 }

 void EndAsyncOperation (IAsyncResult ar)
 {
  string text;
  using (WebResponse response = m_Request.EndGetResponse(ar))
  {
   using (StreamReader reader = new StreamReader(response.GetResponseStream()))
   {
    text = reader.ReadToEnd();
   }
  }

  Regex regex = new Regex ("href\\s*=\\s*\"([^\"]*)\"", RegexOptions.IgnoreCase

下一頁
返回列表
返回首頁 主站蜘蛛池模板: 国产三级无码内射在线看| 日韩福利片午夜在线观看| 国产h视频在线观看| 久久国产精品偷| 欧美成人片在线观看| 国产区女主播在线观看| 窝窝影院午夜看片| 在线视频欧美日韩| 一本高清在线视频| 抱着娇妻让粗黑人人玩3p| 久久精品中文闷骚内射| 欧美三级免费观看| 亚洲欧洲另类春色校园网站| 色屁屁影视大全| 国产成人一区二区三区精品久久| a级毛片免费全部播放无码| 日本爆乳片手机在线播放| 亚洲人成在线播放网站岛国| 正在播放宾馆露脸对白视频| 四虎影院永久网址| 2021国内精品久久久久影院| 天堂√在线中文资源网| 久久天天躁狠狠躁夜夜不卡| 欧洲成人午夜精品无码区久久 | 两夫妇交换的一天| 日本特黄特色aaa大片免费| 亚洲欧美专区精品久久| 美女羞羞视频免费网站| 国产欧美第一页| 18精品久久久无码午夜福利| 在线中文字幕日韩欧美| h肉3d动漫在线观看网站| 日日婷婷夜日日天干| 久久精品国产亚洲香蕉| 最近高清中文在线国语字幕 | 亚洲国产欧美在线看片一国产| 91香蕉视频成人| 国产精品无码不卡一区二区三区 | 好男人在线社区www在线视频一| 久久精品国产大片免费观看| 污污内射在线观看一区二区少妇 |