2013-01-06 36 views
3

這兩種行動方法有什麼區別?異步控制器給我什麼優勢?

public ActionResult Index() 
{ 
    var task = new ServiceClient().GetProductsAsync(); 

    return View(task.Result); 
} 

public async Task<ActionResult> Index() 
{ 
    var task = new ServiceClient().GetProductsAsync(); 

    return View(await task); 
} 

回答

6

第一個將阻塞ASP.Net請求線程,直到您從數據庫中獲得結果。

第二個將立即釋放ASP.Net線程,然後抓住一個又一個,當結果進來。

因此,第二個是更具可擴展性。

請注意,這個答案假設您所調用的異步鏈正確寫入,並以實際的異步套接字操作結束。

+0

您有參考嗎?我對「異步」的理解是不創建新線程。 –

+0

@KennethK .:正確。相反,回調將被提交給ASP.Net SynchronizationContext,它將在ASP.Net線程上運行回調。 – SLaks

+0

@SLaks正如你所說,異步鏈應該以正確的方式寫入,在這裏我們有一個控制器,並且這個控制器將被Web瀏覽器調用。在特定情況下,我不知道異步和同步之間的區別。 –

2

第一個將阻止ASP.NET請求線程,直到任務完成。
第二個會立即釋放線程,然後在任務完成時再抓另一個線程。

有什麼優勢?

線程實際上是一個相當昂貴的資源。它消耗操作系統資源,並且一個線程有一個棧,其中包含了所有在你的方法之前被調用的方法的所有變量。可以說你的服務器足夠強大,它可以處理100個線程。您可以處理100個請求。可以說,處理每個請求需要100ms。這給你每秒1000個請求。

說你的GetProductAsync()調用需要90ms這100ms。一個數據庫或服務佔用大部分時間並不罕見。進行這些調用異步意味着你現在只需要每個線程10ms。突然間,您可以在同一臺服務器上每秒支持10000個請求。

所以「異步控制器的優勢」可能是每秒多10倍的請求。

當然,這一切都取決於您的後端的可擴展性如何,但是爲什麼在.NET爲您完成所有艱難工作時引入瓶頸。除了異步之外,還有很多其他的東西,像魔鬼一樣在細節中。有很多資源可以幫助你,例如http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

+1

非常感謝您的詳細解釋! –