Async web api在完成之前返回

时间:2015-01-20 19:24:38

标签: c# asp.net multithreading asp.net-web-api

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

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

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

//正在处理数据时返回   return objReturn;

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

谢谢你的建议。

对于那些要求的更多代码,以下代码向我发出警告,该方法缺少等待并将同步运行。

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;

}

2 个答案:

答案 0 :(得分:2)

如果我正确地阅读了您的问题,您希望用户调用API,快速接收响应,并使该触发更长时间运行任务。

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

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

你的Api会让它发挥作用! (使用数据库,队列,文件等)

然而,取决于这是多么重要,多少努力,多少时间......你可能不想创建一个完整的单独服务。有一些“工具”可以帮助你。

QueueBackgroundWorkItem

http://hangfire.io/

^^他们将帮助您直接在Api中执行长任务! ^^

答案 1 :(得分:1)

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

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