Visual Studio提供的Controller創建向導默認為我們創建一個繼承自抽象類Controller的Controller類型,這樣的Controller只能定義同步Action方法。如果我們需要定義異步Action方法,必須繼承抽象類AsyncController。這篇問你講述兩種不同的異步Action的定義方法和底層執行原理。
一、基于線程池的請求處理
ASP.NET通過線程池的機制處理并發的HTTP請求。一個Web應用內部維護著一個線程池,當探測到抵達的針對本應用的請求時,會從池中獲取一個空閑的線程來處理該請求。當處理完畢,線程不會被回收,而是重新釋放到池中。線程池具有一個線程的最大容量,如果創建的線程達到這個上限并且所有的線程均被處于“忙碌”狀態,新的HTTP請求會被放入一個請求隊列以等待某個完成了請求處理任務的線程重新釋放到池中。
我們將這些用于處理HTTP請求的線程稱為工作線程(Worker Thread),而這個縣城池自然就叫做工作線程池。ASP.NET這種基于線程池的請求處理機制主要具有如下兩個優勢:
如果請求處理操作耗時較短,那么工作線程處理完畢后可以及時地被釋放到線程池中以用于對下一個請求的處理。但是對于比較耗時的操作來說,意味著工作線程將被長時間被某個請求獨占,如果這樣的操作訪問比較頻繁,在高并發的情況下意味著線程池中將可能找不到空閑的工作線程用于及時處理最新抵達請求。
如果我們采用異步的方式來處理這樣的耗時請求,工作線程可以讓后臺線程來接手,自己可以及時地被釋放到線程池中用于進行后續請求的處理,從而提高了整個服務器的吞吐能力。值得一提的是,異步操作主要用于I/O綁定操作(比如數據庫訪問和遠程服務調用等),而非CPU綁定操作,因為異步操作對整體性能的提升來源于:當I/O設備在處理某個任務的時候,CPU可以釋放出來處理另一個任務。如果耗時操作主要依賴于本機CPU的運算,采用異步方法反而會因為線程調度和線程上下文的切換而影響整體的性能。
新聞熱點
疑難解答
圖片精選