有好多與復雜數據操作,IO讀寫,發Mail等操作需要用戶等待,這樣用戶體驗是十分不好的,我們可以把用戶不需要知道的東西隱藏起來(通過異步調用),提高頁面的執行時間.
ASP.Net接收到一個頁面請求時,會從一個線程池中獲取一個線程,並將頁面請求分配給該線程。一個普通的,或者說是同步的頁面在請求期間會占用線程,以防止線程被用於處理其他請求。如果同步請求變為 I/O 密集狀態,例如,當該請求調用一個遠程 Web 服務或查詢遠程數據庫並等待調用返回時,則分配給它的線程在調用返回前會始終處於閒置狀態。這種情況會限制可伸縮性,因為線程池中的可用線程是有限的。如果處理請求的所有線程都因等待 I/O 操作的完成而阻塞,則會有多余的請求排隊等待這些線程的釋放。最好的情況是出現吞吐量降低,因為需要等待更長的等待才能處理請求。最糟糕的情況是隊列被填滿而 ASP.Net 無法處理後續請求,並提示 503“服務器不可用”錯誤。
asp.net異步調用為解決 I/O 密集型的請求所導致的此類問題提供了簡潔的方案。頁面處理要在線程池中的一個線程上進行,但是當一個異步 I/O 操作響應來自 ASP.NET 的信號並開始進行時,該線程會返回原先的線程池。操作完成後,ASP.Net 會從線程池中獲取另一個線程來完成處理請求。這樣,線程池的線程使用率得到提高,可伸縮性也因此得以增強。那些本來要等待 I/O 操作完成而阻塞的線程此時可以用於處理其他請求。這樣做的直接好處就是避免請求執行冗長的 I/O 操作,因此可以快速進出管道。等待進入管道的時間過長會對此類請求的執行造成的很大的負面影響。(以上來自網絡)
在ASP.Net中存在多種異步調用機制,包括異步頁面,異步委托等.下面簡單說下自己在開發中使用的異步委托調用.
首先聲明一個委托,eg: