从我的理解上来看,使用 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(); ...... }
不知道这样理解可正确,请指正。
对这个研究不多,关注一下。
你的第一个方案里,数据库使用异步操作,而这段代码本身来说是同步的(异步后等待结果)。
第二个方案:action本身是同步的,虽然数据库的执行是异步的,只是行为体的任务异步了而已。
个人理解:action的异步操作,目的是让我们的action调用能及时反馈结果,而把这个内容的返回交给异步来实现。
不用了哦 你在这个action执行的时候会异步去执行另一个, 但如果你后面有需要用这个异步执行结果的 还是会阻断线程 但 每个人请求执行的是不同的 所以 你可以不用也可以用,
项目中实践过,最好在异步的action也用异步的数据操作,除非这个数据操作是有先后关系的,无优先级可以 await Task.waitall