Aysnc webapi post return before finishing



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

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

启动一个线程来处理数据

处理数据时返回 返回对象返回;

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

感谢您的建议。

对于那些询问的人,更多代码,以下代码给了我一个警告,即该方法缺少等待并将同步运行。

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,快速收到响应,并触发运行时间更长的任务。

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

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

您的 API 会给它工作!(使用数据库、队列、文件等)

但是,取决于这有多重要,多少努力和多少时间......您可能不希望创建完整的单独服务。有一些"工具"可以帮助您。

队列背景工作项

http://hangfire.io/

^^ 它们将帮助您直接在 API 中运行长时间的任务! ^^

该警告解释了您的大部分问题。仅使用异步修饰方法并不意味着它会自动异步运行。如果数据处理逻辑中没有任何异步工作,它将同步运行。事件 如果其中有一些异步调用,编译器可以决定同步运行它,如果它认为这是更好的选择。请记住,异步工作不涉及另一个线程。

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

最新更新