2015-01-20 47 views
0

我正在做一个asp.net webapi调用,它将一些数据发布到服务器,并且需要进行处理。客户端不需要等待处理完成。我想回到这样的事情Aysnc webapi完成之前发布的邮件

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

//启动一个线程做一些工作处理数据

//回报,而正在处理数据 回报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; 

} 
+1

[*您尝试过什么?*](http://www.whathaveyoutried.com) – 2015-01-20 19:28:10

+0

返回数据正在处理中返回objReturn;'这需要'异步'请提供更多代码已经累了,或试图..上面的一行代码并不表示你正在努力完成的任务 – MethodMan 2015-01-20 19:28:57

+0

我主要尝试寻找如何做到这一点的示例,我发现了很多关于做错的警告,但是我没有使用asp.net做任何异步编程webapi之前。 – user3648646 2015-01-20 19:30:24

回答

2

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

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

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

您的Api将给它的工作! (使用数据库,队列,文件等)

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

QueueBackgroundWorkItem

http://hangfire.io/

^^他们会帮助你在你的API直接运行较长的任务! ^^

1

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

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

相关问题