我正在開發一個將使用Asp Net Web Api的Asp Net MVC客戶端。我必須決定如何更好地設計我的應用程序。在搜索了一段時間後,我發現有人建議(例如,here)使MVC操作方法異步。我還發現,具有異步操作方法的主要好處是服務器的可伸縮性,即服務器將能夠提供更多的請求。有一件事,我正在使用的web api具有同步操作方法,並且會在同一臺服務器上運行。所以我的猜測是,對我來說,爲我的MVC實現異步操作方法沒有任何好處,因爲即使我的MVC操作方法是異步的,並且服務器將最終能夠從「MVC的觀點」進行擴展,但這些方法將會仍然使用同步Web Api方法,因此,服務器將不可避免地耗盡其線程池。也許我錯過了一些東西,或者異步操作方法還有其他一些好處?在使用同步操作方法使用Asp Net Web Api的Asp Net MVC應用程序中使用異步操作方法有什麼好處?
這裏是我寫的一個非常簡單的示例代碼,使您更好地理解我的問題:
這是Web API控制器:
public class UsersController : ApiController
{
private readonly IUserService _userService;
public UsersController(IUserService userService)
{
_userService = userService;
}
// As you can see this method is not asynchronous
public User Get(int id)
{
return _userService.GetUserById(id);
}
// some other code
}
這是MVC控制器,我有兩個選擇如何設計我的操作方法:
public class UsersController : Controller
{
// A) Make simple synchronous action methods
public ActionResult UserPageSync()
{
IUserWebServiceSync userWebServiceSync = new UserWebServiceSync();
User user = userWebServiceSync.GetUserById(1);
return View();
}
// B) Make asynchronous action methods
public async Task<ActionResult> UserPageAsync()
{
IUserWebServiceAsync userWebServiceAsync = new UserWebServiceAsync();
User user = await userWebServiceAsync.GetUserByIdAsync(1);
return View();
}
}
有異步和同步方法是好的。在您擔心之前,我會一直等到您的應用程序的性能出現問題。擁有大量的異步方法意味着,例如,當您的應用程序進入數據庫以獲取某些信息時,它會將請求連續發送到數據庫,而不是如果您的方法是同步的。這意味着它使您的數據源成爲瓶頸,而不是實際的應用程序。我建議你看看它是如何發展的,如果你遇到問題並且決定一個個案的最佳解決方案,請描述你的應用程序。 – Luke
@Luke您是否暗示,如果我的web api在mvc動作方法中被調用了兩次或更多次,那麼如果這些方法是異步的,請求將會更快地發送出去?你會說現在讓它們異步還是同步更好? –
我認爲你可能會混淆WebAPI,你不會從操作方法調用WebAPI。雖然您的網頁可能會通過Javascript調用WebAPI。是的,如果您的WebAPI方法被定義爲調用堆棧中的異步,包括異步數據庫調用,那麼如果此方法連續快速調用兩次,UI綁定線程將被釋放以供其他調用者使用,所以是從理論上來說,對數據庫的調用可能不會被缺少線程所阻塞,因此它們會根據負載更快地訪問數據庫。 – Luke