34

我想了解爲什麼以及何時應該使用async控制器操作。最終,當我在其中使用await時,它將等待操作完成以返回視圖。ASP.NET MVC4異步控制器 - 爲什麼要使用?

例如

public async Task<ActionResult> TryMe() 
{ 
    await SomeActionAsync(); 
    return View(); 
} 

在這種情況下,如果我使用async或不使用async,在行動將採取相同的時間執行。

如果我沒有試圖並行運行至少2個慢速操作(並不依賴於對方),我沒有看到任何使用控制器操作的理由。

如果我錯了,請糾正我。我想我在這裏錯過了一些東西。

回答

50

await關鍵點的目的是讓您在不寫醜陋回調的情況下使用異步操作

使用異步操作有助於避免浪費線程池線程。

說明

ASP.Net運行所有的代碼從託管線程池中的線程。
如果您一次運行的請求太多,線程池將會滿,並且新的請求將需要等待線程獲得空閒。

然而,您的請求通常很慢,並不是因爲它們正在執行計算(計算綁定),而是因爲它們正在等待其他內容,如硬盤,數據庫服務器或外部Web服務( IO-或網絡綁定)。

浪費珍貴的線程池線程只是爲了等待外部操作完成沒有意義。

異步操作允許您啓動操作,將您的線程返回到池中,然後在操作完成時在不同的線程池線程上「喚醒」。
運行正在運行時,不消耗線程。

+0

因此,你所說的是我應該使用異步方法(如你所說的操作(DB,文件系統,WS等)來釋放線程池?因爲執行時間將保持不變當我嘗試運行這樣的操作時,總是使用異步是最好的做法嗎? – DorR 2013-03-03 20:02:33

+0

@DorR:是的,注意並不是所有的操作都必須有異步實現,.Net 4.5中的大多數非CPU綁定方法現在都有異步但是第三方庫不太可能 – SLaks 2013-03-03 20:21:29

+9

Steve Sanderson在ASP.NET中展示了異步功能:http://channel9.msdn.com/Events/TechDays/Techdays-2012-the -Nelandlands/2287此演示文稿還清楚地顯示了使用異步方法可能會帶來的性能優勢 – 2013-03-06 15:04:57