asp.net非同步頁

來源:互聯網
上載者:User

在請求一個普通的耗時Asp.net Web頁面時(比較慢的資料庫查詢,請求一個網路資源等),asp.net從自身維護的線程池裡取出一個可用的線程處理Web頁(包括對象的執行個體化,相應的事件處理,HTML的呈現等),當線程池裡沒有可用的線程時(網站的請求頻率很高,線程池裡的線程都在處理請求)新的請求將壓入一個隊列,如果隊列滿了,asp.net則返回"伺服器不可用"的503錯誤以拒絕新的請求.
線程池裡的線程數及隊列的大小受多個因素影響,包括IIS版本,.net framework版本,機器CPU數量等
在等待較慢的資料庫查詢或者請求一個網路資源返回結果時,當前使用的線程被掛起,這些線程沒有處理其它的邏輯也沒有佔用CPU,但嚴重影響了整個網站的輸送量,因為網站本應該處理更多的請求的.
在這種情況下可以使用asp.net非同步頁提高網站的輸送量,通過asp.net非同步頁可以將耗時的處理代碼轉移到非asp.net線程裡,當非同步結果返回時會通知asp.net並從Asp.net線程池裡取出一個可用的線程處理結束代碼並呈現HTML.

在使用asp.net非同步頁時有幾個地方需要注意:
1.非同步線程的使用
盡量使用framework內建的非同步支援,SqlCommand,HttpWebRequest,FileStream等對象都提供了相關的BeginXX()和EndXX()方法,這些對象的非同步方法呼叫使用的都不是Asp.net線程池裡的線程.
使用delegate的BeginInvoke()或者ThreadPool.QueueUserWorkItem()都是從asp.net線程池裡取可以的線程,使用它們對解決問題沒有什麼意義.通過Tread類建立自訂的處理線程如果不能很好的管理建立出來的線程就比較危險了(如果同時有N個請求,就會有N個線程被建立,過多的建立線程會影響Asp.net的效能並且可能導致Asp.net網站不能正常處理請求).
2.非同步頁並不比普通頁快
因為非同步頁會有線程切換的過程,所以非同步頁並不比普通頁快.當然在Asp.net非同步頁裡可以通過RegisterAsycTask()方法執行多個並發任務.
3.錯誤處理
使用非同步頁時一定要處理好異常,如果處理不好可能會讓整個進程中指,在非同步作業中發生的異常會在調用EndXX()方法時拋出.
如果異常發生在返回IAsyncResult對象之前發生,可以返回一個實現了IAsyncResult介面的自訂對象.
比如在調用SqlCommand類的BeginExecuteNonQuery(AsyncCallback callback, object stateObject)方法前執行
SqlConnection.Open()方法時發生異常,因為開啟資料庫連接時非同步作業還沒有開始,所以這裡的異常不會在
調用EndExecuteReader(IAsyncResult asyncResult)方法時拋出,因此需要在捕捉到開啟資料庫連接的異常時返回一個自訂IAsyncResult對象.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.