国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

詳解ASP.NET MVC下的異步Action的定義和執行原理

2024-07-10 12:49:26
字體:
來源:轉載
供稿:網友

Visual Studio提供的Controller創建向導默認為我們創建一個繼承自抽象類Controller的Controller類型,這樣的Controller只能定義同步Action方法。如果我們需要定義異步Action方法,必須繼承抽象類AsyncController。這篇問你講述兩種不同的異步Action的定義方法和底層執行原理。

一、基于線程池的請求處理

ASP.NET通過線程池的機制處理并發的HTTP請求。一個Web應用內部維護著一個線程池,當探測到抵達的針對本應用的請求時,會從池中獲取一個空閑的線程來處理該請求。當處理完畢,線程不會被回收,而是重新釋放到池中。線程池具有一個線程的最大容量,如果創建的線程達到這個上限并且所有的線程均被處于“忙碌”狀態,新的HTTP請求會被放入一個請求隊列以等待某個完成了請求處理任務的線程重新釋放到池中。

我們將這些用于處理HTTP請求的線程稱為工作線程(Worker Thread),而這個縣城池自然就叫做工作線程池。ASP.NET這種基于線程池的請求處理機制主要具有如下兩個優勢:

工作線程的重用:創建線程的成本雖然不如進程的激活,卻也不是一件“一蹴而就”的事情,頻繁地創建和釋放線程會對性能造成極大的損害。而線程池機制避免了總是創建新的工作線程來處理每一個請求,被創建的工作線程得到了極大地重用,并最終提高了服務器的吞吐能力。 工作線程數量的限制:資源的有限性具有了服務器處理請求的能力具有一個上限,或者說某臺服務器能夠處理的請求并發量具有一個臨界點,一旦超過這個臨界點,整臺服務將會因不能提供足夠的資源而崩潰。由于采用了對工作線程數量具有良好控制的線程池機制,ASP.NET MVC并發處理的請求數量不可能超過線程池的最大允許的容量,從而避免了在高并發情況下工作線程的無限制創建而最導致整個服務器的崩潰。

如果請求處理操作耗時較短,那么工作線程處理完畢后可以及時地被釋放到線程池中以用于對下一個請求的處理。但是對于比較耗時的操作來說,意味著工作線程將被長時間被某個請求獨占,如果這樣的操作訪問比較頻繁,在高并發的情況下意味著線程池中將可能找不到空閑的工作線程用于及時處理最新抵達請求。

如果我們采用異步的方式來處理這樣的耗時請求,工作線程可以讓后臺線程來接手,自己可以及時地被釋放到線程池中用于進行后續請求的處理,從而提高了整個服務器的吞吐能力。值得一提的是,異步操作主要用于I/O綁定操作(比如數據庫訪問和遠程服務調用等),而非CPU綁定操作,因為異步操作對整體性能的提升來源于:當I/O設備在處理某個任務的時候,CPU可以釋放出來處理另一個任務。如果耗時操作主要依賴于本機CPU的運算,采用異步方法反而會因為線程調度和線程上下文的切換而影響整體的性能。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武夷山市| 哈巴河县| 宿迁市| 海门市| 中超| 大宁县| 南和县| 萍乡市| 乐至县| 宾川县| 乌拉特后旗| 博兴县| 浦北县| 静宁县| 皮山县| 东兰县| 南华县| 崇礼县| 江都市| 禄劝| 云龙县| 凉城县| 贺州市| 清水县| 蒲城县| 中卫市| 大城县| 山东省| 牡丹江市| 昌平区| 鹿泉市| 刚察县| 弥勒县| 桂东县| 嘉荫县| 富平县| 丰县| 永州市| 永州市| 唐河县| 南溪县|