Async web api post return 完成前

Aysnc webapi post return before finishing

我正在进行 asp.net webapi 调用,该调用将一些数据发布到服务器并需要进行处理。客户端不需要等待处理完成。我想要 return 这样的东西

HttpResponseMessage objReturn = Request.CreateResponse(HttpStatusCode.Ok);

//启动一个线程来处理数据

//return 正在处理数据 return objReturn;

我找到的大部分示例都是关于如何使用异步方法并等待处理完成的。我需要相反的东西。

感谢您的建议。

更多代码给那些问的人,下面的代码给了我一个警告,该方法缺少 await 并且将 运行 同步。

public async Task<HttpResponseMessage> Post()
{
  HttpResponseMessage objReturn = Request.CreateResponse(HttpStatusCode.Ok);

  //data processing logic
  //something longer running that the client doesnt need to wait for 
  //like converting a pdf to jpg or other I/O operations

  return objReturn;

}

如果我没看错你的问题,你希望用户调用 API,快速收到响应,并触发更长的 运行ning 任务。

一般来说,您不会使用 Web Api 来 运行 这个较长的任务,而是使用服务(即 Windows 服务)。

该服务将坐在那里...等待工作...

你的 Api 会成功的! (使用数据库、队列、文件等)

但是,根据这有多重要、付出多少努力和多少时间……您可能不想创建一个完整的独立服务。有一些"tools"可以帮助你。

QueueBackgroundWorkItem

http://hangfire.io/

^^ 他们将直接帮助您 运行 完成 Api 中的长期任务! ^^

该警告解释了您的大部分问题。仅仅用异步装饰一个方法并不意味着它 运行 自动异步。如果您的数据处理逻辑中没有任何异步工作,它将 运行 同步。如果你在那里有一些异步调用,如果编译器认为这是更好的选择,它可以决定同步 运行 它。请记住,异步工作确实 NOT involve another thread.

一些提示您可以做什么。首先,您应该使 I/O 调用异步。 .NET 框架提供了很多你可以在这里使用的东西。其次,您不应该在控制器中完成这项工作。控制器应该很小并且不要进行繁重的处理,因为它是您与世界其他地方的沟通者。将需要更多处理的所有内容传递给一个队列,在该队列中,工作者角色(例如 Windows 服务)会挑选需要完成的工作。这样一来,控制器与将数据传递到队列无关,向客户端提供结果,表明它已放入队列中……并完成了。之后你的控制器可以接手额外的工作。