【问题标题】:Creating an asynchronous controller that returns OK immediately创建一个立即返回 OK 的异步控制器
【发布时间】:2015-02-05 15:25:57
【问题描述】:

我正在尝试结合 webapi 来了解新的 async/await 功能。

我想做的是:

  • 我在某个端点上的控制器 (A) 上收到 (POST) 请求。
  • 此控制器什么都不做,只是将此请求发送到另一个端点上的第二个控制器 (B)(不要问我为什么 - 只是一个思想实验)。
  • 假设 B 做了一些长时间运行的工作(从某处检索数据)并将结果存储在数据库中。

我不想等待 B 的工作,然后才能向发送给 A 的请求返回 OK 消息。我希望能够在工作仍在进行时呼叫 A 并尽快回复 OK在 B 完成。

这甚至可能吗?如果是这样,设计这样的东西的正确方法是什么?

感谢您给我的任何指点。

【问题讨论】:

  • 万一B插入数据库失败怎么办?调用者对此感兴趣吗?
  • 不,不在乎 B 发生了什么。
  • 赞成每个人,因为我从每句话中都学到了一些东西。谢谢大家 - async - await 仅在您必须对长时间运行任务的结果做出响应的情况下才有用。

标签: c# asp.net .net asynchronous async-await


【解决方案1】:

您想要的是在您的通话中触发“即发即弃”语义。

如果您使用的是 .NET 4.5.2,则可以使用 HostingEnvironment.QueueBackgroundWorkItem 在 ASP.NET 线程池线程上注册和排队工作。

如果您使用的是以前的版本,则可以使用 Stephan Cleary 的BackgroundTaskManager

注意这与async-await无关。

示例如下所示:

public HttpResponseMessage Foo()
{
    HostingEnvironment.QueueUserWorkItem(() => { /* offloaded code here */ });
    return Request.CreateResponse(HttpStatusCode.OK);
}

【讨论】:

    【解决方案2】:

    只是一个基于 John Skeet 解释的 async/await 概念的假设。 async/await 模式使用维持状态机的延续。基本上框架应该执行指令直到同步方法结束。

    当它遇到异步调用指令时,它会调用它,如果结果很容易获得,则进入下一步并进行处理。如果在调用后没有立即得到结果,它会从方法返回,这由框架处理。所以在你的情况下,我认为如果你没有代码,它实际上会立即返回。但是,如果您有任何长时间运行的代码,它应该返回将作业留给后台框架线程,但结果可能会在稍后返回。

    如果您的目标是确保不阻挡前景,那么这将通过第一个控制器本身来实现。但即使在您的情况下,第二个控制器也不会阻止 UI。对于您关于这是对还是错的问题,我敢肯定,因为您可能有一些原因使您想到这种模式。

    这里有很多专家。如果我的解释有误,请纠正我:)

    【讨论】:

      【解决方案3】:

      您开始后台工作并立即响应。异步模式仅用于以任何方式响应长时间运行任务的结果并防止阻塞调用线程的情况。 即:

      public bool ControllerAMethod(byte[] somedata)
      {
        Task.Factory.StartNew(() =>
        {
          ControllerB.SendData(somedata);
        });
        return true;
      }
      

      【讨论】:

      【解决方案4】:

      您可能希望使用response code of 202 (accepted) 回复调用者,以向客户端指示正在进行其他一些处理。 然后,如果您的客户需要额外的反馈,它可以进行长轮询,或者您可以实现 websocket 等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-21
        • 2014-09-22
        • 2018-03-03
        • 1970-01-01
        相关资源
        最近更新 更多