我正在制作一个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;
}
答案 0 :(得分:2)
如果我正确地阅读了您的问题,您希望用户调用API,快速接收响应,并使该触发更长时间运行任务。
通常,您不使用Web Api来运行这个更长的任务,而是使用服务(即Windows服务)。
那项服务将坐在那里......等待工作......
你的Api会让它发挥作用! (使用数据库,队列,文件等)
然而,取决于这是多么重要,多少努力,多少时间......你可能不想创建一个完整的单独服务。有一些“工具”可以帮助你。
^^他们将帮助您直接在Api中执行长任务! ^^
答案 1 :(得分:1)
警告解释了您的大部分问题。仅使用异步装饰方法并不意味着它会自动异步运行。如果您在数据处理逻辑中没有任何异步工作,它将同步运行。事件,如果你有一些异步调用,编译器可以决定同步运行它,如果它认为这是更好的选择。请记住异步工作NOT involve another thread。
一些暗示你可以做什么。首先,您应该使您的I / O调用异步。 .NET框架提供了很多可以在这里使用的东西。其次,你不应该在控制器中做那项工作。控制器应该很小,不要进行繁重的处理,因为它是你与世界其他地方的沟通者。将需要更多处理的所有内容传递到队列,其中工作者角色(例如Windows服务)获取需要完成的工作。因此,控制器无需将数据传递到队列,就可以向客户端提供结果,将其放入队列......并完成。之后,您的控制器可以接受额外的工作。