程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET 2.0頁面性能的考慮

ASP.NET 2.0頁面性能的考慮

編輯:關於ASP.NET

一般情況下我們通常在一個頁面中,結合頁面事件處理模型,按順序一步一步的聲明各個處理過程。這就是所說的同步處理(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);
MatchCollection matches = regex.Matches(text);
StringBuilder builder = new StringBuilder(1024);
foreach (Match match in matches)
{
  builder.Append (match.Groups[1]);
  builder.Append("<br/>");
}
Output.Text = builder.ToString ();
  }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved