【问题标题】:What awaits an async action method's return?等待异步操作方法返回的是什么?
【发布时间】:2017-03-21 00:41:39
【问题描述】:

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

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

这将动作方法标记为异步,因此我的名称是“异步动作”,它表明该方法可能包含“等待调用其他async 方法,并且它不会从完全停止运行从上到下的代码行。它还表明它的调用者使用了类似的东西:

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

这意味着此调用将等待Login 派生的任何小(或大量)异步任务完成,然后才能正确返回ActionRsult。我们说调用者正在“等待”它对Login 的调用。我的问题是什么对象在第二个代码块中进行了调用,并“等待异步操作”>

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

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

【问题讨论】:

  • 我不知道你在这里问什么。也许一个代码示例会有所帮助。
  • 框架管道等待操作。最终目的是释放正在等待其他事物(I/O、DB 等)的资源,以便 Web 服务器可以在其他当前请求繁忙时处理更多请求。
  • @mason 这些标签是不是暗示你应该知道我在说什么。我对医学一无所知,但当我不理解论坛上的中间问题时,我不会抱怨。
  • @ProfK 您的问题最初是“防止在菲律宾积压”。我希望你能明白为什么这会引起混乱。您最初还使用我认为无法使用异步操作方法的框架标记了该问题。
  • @mason 我真诚的道歉。当使用同步操作方法确实会导致菲律宾的积压时,可能会有一些非常Goldbergesque 和迷宫般的情况,但让我们假装这是不可能的。

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


【解决方案1】:

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

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

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

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

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

从框架的角度来看,它理解当一个动作返回一个任务时,它不一定已经完成。相反,该操作将在返回的任务完成时完成。框架为该任务连接了一个回调,该任务完成后将发送响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2015-09-21
    • 2017-09-24
    相关资源
    最近更新 更多