什么等待异步操作方法的返回?

时间:2016-11-07 15:46:22

标签: asp.net asp.net-mvc asynchronous async-await

在ASP.NET MVC和Web API中,异步操作是一个用修饰符async标记的控制器操作方法,例如:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)

这将action方法标记为异步,因此我的'异步操作'名称,它表示该方法可能包含'等待调用其他async方法,并且它不会运行完整停止从顶部到底部的代码行。它还表明它的调用者使用类似的东西:

ActionResult result = await Login(LoginViewModel model, string returnUrl)

这意味着在正确返回Login之前,此调用将等待ActionRsult分离的任何小(或大量)异步任务完成。我们说呼叫者在等待Login的呼叫时正在“等待”。我的问题是什么对象在第二个代码块中进行调用,并且“等待异步操作”&gt;

我从来没有真正关心过什么叫行动,等待,以前的方法;我一直认为它非常接近请求 - 响应管道,并且在异步操作上,忽略结果过滤器,它几乎直接进入浏览器。

这个等待动作方法的对象是否会这样做,以便它可以调用更多的对象并阻止管道中的积压,或者只是async以便我们可以等待其中的其他任务?

1 个答案:

答案 0 :(得分:0)

  

在异步操作上,忽略结果过滤器,它几乎直接进入浏览器。

没有;异步操作与同步操作一样处理,并且处于相同的抽象级别。他们不会跳过任何过滤器。

同步和异步方法之间的区别在于同步方法在返回其调用者时是完整的;异步方法返回在方法完成时完成的任务。有关详细信息,请参阅我的async intro帖子。

  

这个等待动作方法的对象是否会这样做,它可以调用更多的对象并阻止管道中的积压,或者只是异步,以便我们可以等待其中的其他任务?

两者。 async关键字是使用await关键字所必需的,因此从操作的角度来看,async需要等待其他任务。

从框架的角度来看,它理解当一个动作返回一个任务时,它不一定完成。相反,当返回的任务完成时,操作将完成。该框架将该回调挂钩到该任务,该任务将在该任务完成时发送响应。