C# 创建立即返回OK的异步控制器

C# 创建立即返回OK的异步控制器,c#,asp.net,.net,asynchronous,async-await,C#,Asp.net,.net,Asynchronous,Async Await,我正试图将新的异步/等待功能与webapi结合起来 我想做的是: 我正在某个端点上的控制器(a)上接收(POST)请求 这个控制器什么也不做,只是将这个请求发送到另一个端点上的第二个控制器(B)(不要问我为什么——只是一个思想实验) 假设B执行一些长时间运行的工作(从某处检索数据),并将结果存储在数据库中 我不想等待B的工作,然后才能将OK消息返回给发送给a的请求。我希望能够在B的工作仍在完成时尽快呼叫a并返回OK 这可能吗?如果是这样的话,设计这样的东西的正确方法是什么 感谢您给我的任何提

我正试图将新的异步/等待功能与webapi结合起来

我想做的是:

  • 我正在某个端点上的控制器(a)上接收(POST)请求
  • 这个控制器什么也不做,只是将这个请求发送到另一个端点上的第二个控制器(B)(不要问我为什么——只是一个思想实验)
  • 假设B执行一些长时间运行的工作(从某处检索数据),并将结果存储在数据库中
我不想等待B的工作,然后才能将OK消息返回给发送给a的请求。我希望能够在B的工作仍在完成时尽快呼叫a并返回OK

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


感谢您给我的任何提示。

您可能想用一个命令响应调用方,以指示客户端正在进行其他处理。
然后,如果您的客户需要额外的反馈,它可以进行长时间的轮询,或者您可以实现websocket等。

您想要的是在您的通话中触发“触发并忘记”语义

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

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

注意这与
异步等待
无关

示例如下所示:

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

这只是基于John Skeet解释的异步/等待概念的假设。async/await模式使用continuations来维护状态机。基本上,框架应该执行指令,直到同步方法结束

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

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


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

您开始后台工作并立即回复。异步模式仅在您必须以任何方式响应长时间运行的任务的结果并防止阻塞调用线程的情况下使用。 i、 e:


如果B无法插入数据库,会发生什么情况?打电话的人对此感兴趣吗?不,不在乎B中发生了什么。投票给每个人,因为我从每句话中学到了一些东西。谢谢大家,async-await这句话只在需要对长时间运行的任务的结果做出响应的情况下才有用。在ASP.NET中。
public bool ControllerAMethod(byte[] somedata)
{
  Task.Factory.StartNew(() =>
  {
    ControllerB.SendData(somedata);
  });
  return true;
}