2016-11-07 131 views
-2

在ASP.NET MVC和Web API,异步操作是标有改性剂async,例如控制器的操作方法:什么等待异步操作方法的返回?

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

这标志着动作方法,异步,的“一个因此我的化名异步操作“,并且它表示该方法可能包含'等待被调用到其他方法,并且它不会从上到下执行完整的代码行。这也表明,它的呼叫者使用类似:

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

意味着该呼叫等待通过Login分拆之前完成正确返回ActionRsult任何一点(或块状)异步任务。我们说,呼叫者正在等待拨打Login。我的问题是什么对象在第二个代码块中调用这个函数,然后'等待异步操作'>我从来没有真正关心过什么叫做动作,并等待着,之前的一种方法;我一直认为它与请求 - 响应流水线非常接近,并且在异步操作上忽略了结果过滤器,它几乎直接进入浏览器。

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

+2

我不知道你在问什么。也许一个代码示例会有所帮助。 – mason

+1

框架管道等待操作。最终目的是发布否则等待其他事情(I/O,数据库等)的资源,以便Web服务器可以处理更多的请求,而其他当前请求很忙。 – David

+0

@mason不要标签表明你应该知道我在说什么。我对药物一无所知,但当我不了解论坛上的中间问题时,我不会抱怨。 – ProfK

回答

0

对于异步操作,忽略结果过滤器,它几乎直接浏览器。

否;异步操作就像同步操作一样进行处理,并处于相同的抽象级别。他们不会跳过任何过滤器。

同步方法和异步方法之间的区别在于同步方法在返回给调用者时完成;异步方法返回完成该方法后完成的任务。有关更多信息,请参阅我的async intro帖子。

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

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

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