程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 領先技術 - 再探異步ASP.NET頁

領先技術 - 再探異步ASP.NET頁

編輯:關於ASP.NET

ASP.NET 始終支持同步和異步 HTTP 處理程序。現在,ASP.NET 2.0 擁有了一 些新增功能,可使開發人員更加方便快捷地創建異步頁面。尤其是對於基於服務 器的應用程序,異步操作是實現可伸縮性的基礎。如果需要擴展現有 Web 應用程 序,首先要考慮的是能向頁面添加多少異步功能。

在這方面,ASP.NET 的行為與代表多個客戶端執行某些後台工作的任何其他服 務器應用程序十分相似。每個傳入請求都分配給 ASP.NET 擁有的線程,該線程是 從 ASP.NET 線程池選擇的。在操作終止並為客戶端生成某種響應之前,該線程將 一直被阻止。線程要等待多長時間?ASP.NET 運行時環境可配置為定義一個自定 義超時(默認值為 90 秒),但防止線程被阻止更為重要。

在處理可能耗時很長的操作時,超時最多只能確保該線程在給定秒數之後得到 釋放並返回到池中。實際上,您所需要的是防止長時間阻止該線程。理想情況下 ,您需要該線程開始一個請求,然後將其交給某個其他非 ASP.NET 線程。在將響 應發送到客戶端的操作完成時,將再次選擇同一個線程或 ASP.NET 池中的另一個 線程。這種模式稱為異步 ASP.NET 頁面。

就異步操作而言,應區分相對於用戶的異步頁面和相對於 ASP.NET 運行時的 異步頁面。對於相對於用戶的異步頁面,唯一的可行方法是 AJAX 操作。但是, 使用 AJAX 來執行速度可能較慢的操作會降低對最終用戶的影響,但不會為 ASP.NET 運行時帶來任何緩解。

異步頁面和 ASP.NET 運行時

線程在請求上掛起的時間越長,為了處理新的傳入請求而從 ASP.NET 池減去 一個線程的時間就越長。當沒有可用於處理新請求的線程時,就會將這些請求排 隊。這可能會導致延遲和總體性能下降。

在 ASP.NET 中,HTTP 處理程序在默認情況下是同步的。必須通過應用略微不 同的接口顯式構建和實現異步 HTTP 處理程序。同步處理程序與異步處理程序的 主要不同之處在於,異步處理程序使用下列方法(IHttpAsyncHandler 接口的組 成部分),而不是使用同步 ProcessRequest 方法:

IAsyncResult BeginProcessRequest(

    HttpContext context,

    AsyncCallback cb,

    object extraData);

void EndProcessRequest(

    IAsyncResult result);

BeginProcessRequest 包含為處理請求而需要執行的操作。此代碼應設計為在 輔助線程上啟動操作並立即返回。EndProcessRequest 包含用於完成先前已啟動 的請求的代碼。

可以看到,一個異步 HTTP 請求分成兩個部分,即“異步點”之前和之後,異 步點是請求生命周期中擁有請求的線程發生更改的點。當達到異步點時,原始 ASP.NET 線程向另一個線程交出控制權。這個可能耗時較長的操作發生在 ASP.NET 請求的兩個部分之間。異步請求的每個部分都獨立於另一部分運行,就 線程而言沒有任何相關性。換句話說,不能保證用同一線程處理請求的兩個部分 。實際效果是,在操作過程中不會阻止任何線程。

此時,明顯的問題是:哪個線程實際負責處理“耗時較長”的操作?ASP.NET 在內部使用 I/O 完成端口來跟蹤請求的終止。當達到異步點時,ASP.NET 將掛起 的請求綁定到一個 I/O 完成端口,並注冊一個回調以在終止請求時獲取通知。操 作系統將使用自己的專用線程之一來監視操作的終止,從而使 ASP.NET 線程不必 在完全空閒的狀態下進行等待。操作終止時,操作系統將一條消息放置在完成隊 列中,該消息將觸發 ASP.NET 回調,隨後,該回調獲取自己的線程之一來恢復請 求。如前所述,I/O 完成端口是操作系統的一個功能。

異步頁面的實際特性

在 ASP.NET 中,如果考慮改進給定頁面(負責執行可能耗時較長的操作)的 性能,通常就涉及異步頁面。不過,還應注意幾個其他問題。從用戶的角度來看 ,同步和異步請求看起來幾乎相同。比如,如果請求的操作預期需要 30 秒完成 ,則用戶將至少等待 30 秒才能獲得新的頁面。無論是同步還是異步實現該頁面 ,都會出現這種情況。此外,如果某個異步頁面耗費略微長一點時間才完成一個 請求,也很正常。那麼,異步頁面有何優點?

可伸縮性和性能並不完全一樣。或者至少,可伸縮性與性能有關,不過是在不 同級別上,即整個應用程序而不是單個請求。異步頁面的優點是,可以顯著減少 ASP.NET 池中的線程的工作量。這並不會使耗時較長的請求運行更快,但它可幫 助系統按通常方式處理耗時不長的請求,也就是說,不會因運行較慢的請求而產 生任何特殊延遲。

異步請求利用異步 HTTP 處理程序,這始終是 ASP.NET 平台的一個功能。但 是,ASP.NET Web 窗體和 ASP.NET MVC 都提供了自己的功能,以便開發人員更方 便地實現異步操作。在本文其余部分,我將討論 ASP.NET MVC 2 中的異步操作。

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