Asp.net
當 IIS 已經處理請求並發時,為什麼要使用非同步控制器?
我想知道當 IIS 已經為我處理並發時,我為什麼還要在控制器上使用非同步任務?
asp.net 中的非同步/等待與並發無關,它與阻塞或不阻塞執行緒有關。
如果您使用 async / await 您在等待操作時釋放執行緒。如果此操作受 CPU 限制,則沒有任何好處(由於上下文切換,它甚至會稍微慢一些)
如果操作是 IO 綁定的(網路、磁碟等),則意味著 IIS 可以處理更多並發請求,因為您不會阻塞任何不做任何事情的執行緒。
正如其他人指出的那樣,
async允許請求執行緒在執行非同步操作時返迴執行緒池。使用同步處理程序,您的伺服器最終將在 I/O 上阻塞執行緒,基本上沒有做任何重要的事情,但也無法在其他請求被阻塞時用於其他請求。async只是釋放這些執行緒,以便它們一直有用。所以,首先要注意的是“
async或執行緒池”這個問題是錯誤的問題。使用 時async,您允許 ASP.NET 最大限度地利用現有執行緒池。async採用 ASP.NET 中現有的(並行)並發並添加(非同步)並發以實現更大的可伸縮性。但問題仍然是“為什麼”?原因有兩個:
async可以比(僅)執行緒池擴展得更遠,並且async響應速度更快。正如其他答案的評論中所提到的,執行緒是不必要地浪費的重量級對象;非同步操作的記憶體遠小於執行緒使用的記憶體。第二個原因也很重要:當突然爆發的請求進來時,執行緒池(本身)只能以有限的速度擴展;async使執行緒池能夠更有效地處理請求的突發。