0

我正在開發一個將使用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(); 
    } 
} 
+1

有異步和同步方法是好的。在您擔心之前,我會一直等到您的應用程序的性能出現問題。擁有大量的異步方法意味着,例如,當您的應用程序進入數據庫以獲取某些信息時,它會將請求連續發送到數據庫,而不是如果您的方法是同步的。這意味着它使您的數據源成爲瓶頸,而不是實際的應用程序。我建議你看看它是如何發展的,如果你遇到問題並且決定一個個案的最佳解決方案,請描述你的應用程序。 – Luke

+0

@Luke您是否暗示,如果我的web api在mvc動作方法中被調用了兩次或更多次,那麼如果這些方法是異步的,請求將會更快地發送出去?你會說現在讓它們異步還是同步更好? –

+0

我認爲你可能會混淆WebAPI,你不會從操作方法調用WebAPI。雖然您的網頁可能會通過Javascript調用WebAPI。是的,如果您的WebAPI方法被定義爲調用堆棧中的異步,包括異步數據庫調用,那麼如果此方法連續快速調用兩次,UI綁定線程將被釋放以供其他調用者使用,所以是從理論上來說,對數據庫的調用可能不會被缺少線程所阻塞,因此它們會根據負載更快地訪問數據庫。 – Luke

回答

3

網絡API,我消耗了同步操作方法,並在SA運行me服務器

這是一個非常不尋常的設計。但我會忽略這一點。您可以這樣思考:如果MVC操作是同步的,那麼每個請求需要2個線程(一個用於MVC操作,一個用於WebAPI操作)。如果MVC操作是異步的,那麼它們將對每個請求採用1個線程(沒有一個用於MVC操作,一個用於WebAPI操作)。所以在MVC操作上做異步操作仍然有明顯的好處。

相關問題