2014-09-03 227 views
0

我使用.net框架4.5.1下的Asp.net MVC 5。互聯網上的例子很多顯示控制器的異步動作的使用像下列:異步動作+同步DBQuery VS同步動作+異步DbQuery

public async Task<ActionResult> Practice() 
{ 
    ...... 
    SqlCommand command = new SqlCommand(); 
    ...... 
    await command .ExecuteNonQuery(); 
    ...... 
    return View(); 
} 

同時,SqlCommand的提供等ExecuteNonQueryAsync,其內部實現異步opertaion異步方法,代碼是一樣的東西:

public ActionResult Practice() 
{ 
    ...... 
    SqlCommand command = new SqlCommand(); 
    ...... 
    command.ExecuteNonQueryAsync(); 
    ......  
    return View(); 
} 

假設所有耗時操作都是數據庫CRUD,我想知道上述兩個代碼片段之間是否有區別?

具體來說,兩種方式都是導致最終目標:「一個線程在等待第一個請求完成時不會阻止其他請求的響應,因此異步請求阻止了請求排隊和線程池增長當有很多併發請求調用長時間運行的操作時。「 ?

非常感謝。

回答

1

在第一個查詢中,您看起來像await是一個不會異步編譯的方法。 在第二個例子中,你踢了異步方法,但你並沒有等待它,所以結果視圖將是空的。正確的做法是,你使用這兩種方式的混合模式:

public async Task<ActionResult> Practice() 
{ 
    ...... 
    SqlCommand command = new SqlCommand(); 
    ...... 
    await command.ExecuteNonQueryAsync(); 
    ...... 
    return View(); 
} 

await的結果ExecuteNonQueryAsync所以一旦完成,你大概可以使用命令的結果來填充視圖。