2014-12-13 88 views
3

我最近繼承了ASP.NET MVC項目。在該項目中,開發人員無處不在處使用async。我試圖評估它是否是一個好主意。具體來說,我正在審查控制器代碼。總是在ASP.NET MVC控制器中使用異步

在控制器,開發人員寫類似下面的東西:

public async Task<ActionResult> Index() 
{ 
    return View(); 
} 

是否有任何優勢,這代替了傳統的版本:

public ActionResult Index() 
{ 
    return View(); 
} 

我能理解使用async如果await被用在控制器代碼中。很多時候,它沒有被使用。這種方法有什麼理由嗎?

+0

我這個[文章](http://blog.stevensanderson.com/2010/01/25/measuring-the-performance-of-asynchronous-controllers/)總結了AsyncController所要做的。 – 2014-12-13 15:43:29

回答

5

不,這是不是一個好主意,到處使用異步。

關於缺少等待,當Async方法不包含Await運算符時,編譯器會發出警告。沒有等待的異步方法將同步運行,這使得語義不正確。

爲了您的具體的例子,操作簡單和短期運行,這就是爲什麼使用異步/等待不會帶來任何好處,它不應該被使用,因此使用是完全沒有:

public ActionResult Index() 
{ 
    return View(); 
} 

異步/等待應用於執行某種IO(例如網絡請求,數據庫訪問等)的控制器方法。如果一個控制器方法正在執行CPU綁定工作(例如數學計算),那麼使用Async/Await實際上會使性能變差,除非您的測量證明我錯了。

舊規則適用:測量兩次,切一次

0

如果在此方法中沒有任何地方存在await,則沒有意義做出行動/方法。製作方法async意味着「在盒子下」(通過編譯器)將會創建一個狀態機,與純粹的無效版本相比,開銷很小(開銷很小,但如果每秒有千萬個請求可以產生影響)。如果你害怕可能很快就會有人等待(你最好有「害怕」的理由),並且你有很多代碼依賴這個方法(例如它是抽象類方法/它屬於接口),你應該保留方法返回Task<ActionResult>,但沒有將其標記爲異步。例如:

public Task<ActionResult> MyAction() { 

    return Task.FromResult<ActionResult>(View()); 
} 

Task.FromResult<T>此方法返回完成的任務 - 其防止編譯器創建異步狀態機。

回到你的主要問題 - 好像編寫此代碼的人不知道他們在做什麼 - 標記方法異步並不意味着該方法「異步」工作。

相關問題