Async Action + Sync DBQuery VS sync Action + Async DbQuery

时间:2014-09-03 09:05:10

标签: asp.net-mvc asynchronous

我在.net framework 4.5.1下使用Asp.net MVC 5。互联网上的大量例子显示了控制器的异步动作的使用,如下所示:

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,我想知道上面两个代码片段之间有什么区别吗?

具体而言,有两种方式都可以达到最终目标:&#34;在等待第一个请求完成时,线程不会被阻止响应其他请求。因此,当有许多并发请求调用长时间运行的操作时,异步请求会阻止请求排队和线程池增长。&#34; ?

非常感谢。

1 个答案:

答案 0 :(得分:1)

在第一个查询中,您看起来是await一个不会编译的非异步方法。 在第二个示例中,您将尝试异步方法但不等待它,因此生成的视图将为空。正确的方法是您使用的两种方法的混合:

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

await结果ExecuteNonQueryAsync所以一旦完成,你可以使用命令的结果来填充视图。