我在.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; ?
非常感谢。
答案 0 :(得分:1)
在第一个查询中,您看起来是await
一个不会编译的非异步方法。
在第二个示例中,您将尝试异步方法但不等待它,因此生成的视图将为空。正确的方法是您使用的两种方法的混合:
public async Task<ActionResult> Practice()
{
......
SqlCommand command = new SqlCommand ();
......
await command.ExecuteNonQueryAsync();
......
return View();
}
你await
结果ExecuteNonQueryAsync
所以一旦完成,你可以使用命令的结果来填充视图。