2012-09-19 30 views
0

我知道爲多線程目標創建了AsyncController。但是我沒有看到Controller類和AsyncController類的行爲差異。 例如HomeController的:使用AsyncController有什麼好處?

public String First() 
     { 
      Thread.Sleep(5000); 
      return "First"; 
     } 

     public String Second() 
     { 
      return "Second"; 
     } 

我試圖執行在Firefox的第一個選項卡/主頁/一/請求,之後,我嘗試執行/主頁/二/和我看到二動作立即執行,沒有任何延遲並且不需要等待第一個動作。這意味着在並行線程和Controller類中執行的請求具有多線程支持。 當我用AsyncController替換控制器時,我不會注意到這些更改。

所以我的問題是:使用AsyncController的好處是什麼,在哪種情況下我應該使用那個類?

+1

Dino Esposito最近的博客文章[「ASP.NET:Go Async or Sink」](http://www.simple-talk.com/dotnet/asp.net/asp.net-go-async- or-sink /)討論(同時也涉及更新的技術)你可能想要異步行爲的原因。 –

回答

3

有些情況下,用戶請求會等待較大的IO操作,例如從另一個站點下載內容。如果提供該請求的控制器是同步的,那麼線程將等待IO操作完成,並且服務器資源被浪費。服務器對服務器的線程數量有限,並且如果多個用戶請求相同的操作且IO開銷較大,則服務器可能會達到其線程限制,並且應用程序將停止響應其他請求。

異步控制器所做的是,它不會使線程等待IO操作完成。它觸發IO操作並釋放線程,並在操作完成後將其拉回。在運行過程中,線程是免費的,可以爲其他用戶的請求提供服務,所以不會再浪費,而且應用程序掛起的機會也會減少。

需要注意的是,異步控制器並不是用來使代碼執行更快,因爲他們不這樣做。

+0

謝謝你的回答。你說服務器線程**觸發IO操作並釋放線程**。但是當服務器觸發IO操作時,它應該將io操作傳遞給另一個線程,我是對的?並且這是否意味着另一個線程將繁忙。這種情況有什麼好處?在這種情況下,服務器會一次執行更多請求嗎?那是對的? – testCoder

+0

是否曾經擔心與AsyncController的數據併發?如果您將線程返回並且其他人對AsyncController中正在使用的數據進行了更改,則兩者都會通知對方? – eaglei22