2017-06-16 15 views
0

我正在寫一個WebAPI微服務,並且想知道是否有利於使用async。該服務通過實體框架調用SQL數據庫。單線程應用程序的異步的好處

同步:

using(var db = new Entities()) 
{ 
    var user = db.Users.FirstOrDefault(); 
    user.IsActive = false; 
    db.SaveChanges(); 
} 

異步:

using(var db = new Entities()) 
{ 
    var user = await db.Users.FirstOrDefaultAsync(); 
    user.IsActive = false; 
    await db.SaveChangesAsync(); 
} 

不像async我已經看到了一些用例,沒有拉開awaitable子任務與促成的處理暫停來自await(因此「單線程」,但可能不是字面上)。

我的問題是,從資源的角度來看,這與同步替代方案有什麼不同?假設它在控制器中始終是異步的,服務是否會更好地擴展?

獎勵要點:在其他異步應用程序(如開發人員忘記利用異步方法)中進行一些同步阻塞的含義是什麼?

+0

「asynchrounous」是什麼意思? –

+0

返回任務而不是結果。 「一路通過控制器」意味着一個任務不會被調用.Result或.Wait() –

回答

2

我建議你閱讀我的intro to async on ASP.NET文章,尤其是上半場。

我的問題是,從資源的角度來看,這是如何真正不同於同步替代?

同步版本阻止Web服務器中的線程,直到SQL查詢和更新全部完成。當SQL查詢和更新正在進行時,異步版本不會消耗Web服務器中的線程。線程越少意味着您的Web服務可以更輕鬆地完成其他任務。

假設它一直通過控制器異步,服務規模會更好嗎?

您的網絡服務?是。作爲一個整體的服務?這取決於;具體來說,這取決於你的後端如何擴展。如果它只是一個單一的SQL服務器後端,那麼在擴展你的Web服務器時可能沒有意義,因爲你的SQL服務器將成爲你的瓶頸。如果它是一個SQL集羣或Azure SQL,那麼(可能)使用異步將有利於整個系統。

獎勵要點:在其他異步應用程序中做一些同步阻塞(例如,如果開發人員忘記利用異步方法)會產生什麼影響?

然後爲該操作消耗一個線程。例如,如果異步版本使用FirstOrDefaultAsyncSaveChanges(而不是SaveChangesAsync),那麼該線程將在查詢期間釋放,但在保存期間被阻塞。

相關問題