首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 2.0 頁面效能優化:非同步頁面模型與 ThreadPool 壓力釋放

     編輯:關於ASP.NET

同步處理模型雖直觀,但在高併發、長耗時請求(如呼叫外部 Web Service、大量資料庫查詢)下,會耗盡 ThreadPool 工作執行緒,導致伺服器效能驟降甚至崩潰。ASP.NET 2.0 引入非同步頁面模型,在 PreRender 與 PreRenderComplete 之間插入非同步點,讓長耗時作業釋放執行緒回 ThreadPool,完成後再取用執行緒續行,大幅提升併發承載能力。

啟用非同步頁面

在 @Page 指令設定 Async="true",告知 ASP.NET 使用 IHttpAsyncHandler 處理:

<%@ Page Async="true" Language="C#" %>

註冊非同步作業:AddOnPreRenderCompleteAsync

在 Page_Load 中註冊 Begin/End 方法組:

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("https://www.example.com");
    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. 頁面執行至 PreRender 事件。
  2. ASP.NET 呼叫註冊的 BeginAsyncOperation,啟動非同步 I/O(Web Request、DB 查詢、檔案讀寫)。
  3. 執行緒歸還 ThreadPool,可服務其他請求。
  4. 非同步作業完成 → ASP.NET 從 ThreadPool 取得執行緒 → 呼叫 EndAsyncOperation。
  5. 頁面進入 PreRenderComplete → Render 輸出結果。

適用場景與注意事項

  • ✅ 適合:外部 Web Service 呼叫、長時間 SQL 查詢、大檔案 I/O、網路傳輸。
  • ❌ 不適合:CPU 密集運算(仍佔用執行緒)、簡短快速作業(額外開銷不划算)。
  • ⚠️ 所有非同步作業必須在 AsyncTimeout(預設 45 秒)內完成,否則拋出逾時例外。
  • ⚠️ 非同步頁面會增加記憶體佔用(保存狀態物件),需評估容量規劃。

善用非同步頁面模型,是高併發 ASP.NET 應用程式突破 ThreadPool 瓶頸的關鍵鑰匙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved