首页 新闻 赞助 找找看

在Asp.net MVC里使用async action操作数据库的问题

0
悬赏园豆:100 [待解决问题]

  从我的理解上来看,使用 async Task<ActionResult>去在Controller中实现异步action,目的是为了在高耗时的action操作中,可以暂时把线程池让出来给别的请求,一般网上能找到的文章都是在async action中,await SqlCommand.ExecuteNonQuery,这样就可以达到异步的处理目的。

  我的问题是,如果我使用.net中自带的,ExecuteNonQueryAsync,这个方法其实已经在内部实现了异步访问数据库的操作,应用程序中只需要处理其返回结果就可以了-----那这样的话,我还有必要使用异步action吗?

  从我自己的猜测来说,应该是不需要,因为在ExecuteNonQueryAsync的过程中,上下文已经在其内部实现中被挂起,线程池已经将此线程让出给别的请求,即达到了使用异步的目的。

  那么,在只考虑数据库为高耗时操作的情况下,mvc的异步操作可以分为两种实现:

  1. 异步Action + await 同步方法访问数据库

  

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

 

  2. 同步Action + 数据库访问Async

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

 

  不知道这样理解可正确,请指正。

vexy的主页 vexy | 初学一级 | 园豆:102
提问于:2014-09-03 15:53
< >
分享
所有回答(3)
0

对这个研究不多,关注一下。

 

你的第一个方案里,数据库使用异步操作,而这段代码本身来说是同步的(异步后等待结果)。

第二个方案:action本身是同步的,虽然数据库的执行是异步的,只是行为体的任务异步了而已。

 

个人理解:action的异步操作,目的是让我们的action调用能及时反馈结果,而把这个内容的返回交给异步来实现。

519740105 | 园豆:5810 (大侠五级) | 2014-09-03 16:09
0

不用了哦 你在这个action执行的时候会异步去执行另一个, 但如果你后面有需要用这个异步执行结果的 还是会阻断线程   但 每个人请求执行的是不同的 所以 你可以不用也可以用,

望着天的蜗牛 | 园豆:354 (菜鸟二级) | 2014-09-03 21:13
0

项目中实践过,最好在异步的action也用异步的数据操作,除非这个数据操作是有先后关系的,无优先级可以 await Task.waitall

aries_gold | 园豆:141 (初学一级) | 2014-09-04 10:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册