3

在Asp.Net MVC或Asp.Net Web API中,讓每個控制器查詢數據庫(即使是最簡單的查詢)都使用異步/等待模式的操作,是不是很好?是否所有實體框架方法都使用異步?

我知道使用異步/等待增加了複雜性,但增加值得嗎?即使是最簡單的查詢?

+0

理論上:是的。因爲每個DB調用都是IO綁定的,所以會阻塞線程。但實際上,只有當您的webservice或webapp具有足夠高的流量時纔是值得的複雜性。 – Dai

+0

這不關乎流量。這是關於線程成爲稀缺資源的問題,通常它們是充足的。使用異步數據庫訪問幾乎不會增加吞吐量。 – usr

回答

7

實體框架使用數據庫並需要訪問數據庫服務器。使用EF您需要連接數據庫服務器並等待服務器響應您的請求。

如果您的應用程序使用磁盤或網絡(如訪問數據庫)讀/寫,那麼它正在做I/O操作。每個I/O操作都應該使用異步/等待模式,這是EF6公開許多可以使用的異步操作的良好習慣。

I/O綁定是指一種狀態,其中所花費的時間來完成 計算主要由週期確定花在等待 用於輸入/輸出操作來完成的。 來源:維基百科

一些精度:

每個ASP.Net的Web API請求使用由.Net框架線程池給一個線程。如果對ASP.Net Web API操作使用同步方法,則I/O綁定操作(數據庫訪問)將阻塞該線程並等待數據庫作出響應。您的請求使用的線程將被阻止,並且不會返回到線程池。

使用的最大線程數爲5000(.Net 4.5)。如果您的應用程序是一個可以快速達到最大值的大型應用程序。如果線程池中沒有線程可用,則新請求將被添加到隊列中。如果您的服務器隊列已滿,它將拒絕具有HTTP 503狀態的請求,此狀態代表「服務器太忙」

如果您的ASP.Net Web API操作使用async/await模式,那麼每個I/O綁定操作都將釋放當前請求的線程。該線程可以被另一個請求使用。如果I/O綁定操作完成其任務,則會給出另一個線程來處理其餘的ASP.Net Web API操作方法。

所以要回答你的問題。如果您的應用程序可能具有很多併發性,那麼需要訪問數據庫的ASP.Net Web API的每個動作都應該使用異步/等待模式。即使您的應用程序不是更大的應用程序,也總是建議對I/O綁定操作使用異步/等待。您可以選擇article。它討論了ASP.Net MVC的「使用異步方法」,但大多數建議都可以用於ASP.Net Web API。

+0

是的,你說得對。但是我應該考慮只使用需要更長時間的複雜查詢的異步嗎?正在使用異步增加任何複雜性? – Kahbazi

+0

@保存I/O綁定操作並不意味着長時間運行的操作,而只是讀取/寫入訪問,可能會阻塞您的線程而不消耗大量的CPU。我更新了更多精確度。 – CodeNotFound

+0

謝謝你,你知道我可以學習更多關於我的問題的任何文章或參考嗎? – Kahbazi

相關問題