2014-09-03 197 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所以一旦完成,你大概可以使用命令的结果来填充视图。