簡體   English   中英

始終在ASP.NET MVC控制器中使用Async

[英]Always using Async in an ASP.NET MVC Controller

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

在控制器中,開發人員編寫了如下內容:

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

這有什么優勢而不是傳統版本:

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

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

不。在任何地方使用Async都不是一個好主意。

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

對於您的具體示例,操作簡單且運行時間短,這就是為什么使用Async / Await不會帶來任何好處,並且不應該使用它,因此您完全可以使用:

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

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

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

如果在此方法中沒有await任何地方,則無需制作操作/方法。 使方法async意味着“在盒子下面”(通過編譯器)將創建狀態機,這與純虛擬版本相比產生了一點開銷(實際上很小的開銷但是如果你每秒有數百萬個請求可以產生差異;))。 如果你害怕很快就會出現等待(你最好有充分理由“害怕”)並且你有很多代碼依賴於這個方法(例如它的抽象類方法/它屬於接口)你應該保持返回Task<ActionResult>但不將其標記為異步。 例:

public Task<ActionResult> MyAction() {

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

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

回到你的主要問題 - 似乎編寫這段代碼的人不知道他們在做什么 - 標記方法異步並不意味着該方法“異步”工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM