2011-09-21 134 views
2

我想要实现一个WCF服务,该服务会立即响应调用者,但会排队等待稍后处理的异步作业。做这件事的最好方法是什么?我已阅读how to implement an asynchronous service operation上的MSDN文章,但该解决方案似乎仍然需要完成任务才能响应调用者。如何创建异步WCF服务

+0

如果是提交和遗忘操作,则可能需要执行线程或委托,并在Web服务请求立即完成时运行该操作。 但问题是:当流程完成后,您是否需要通知客户?这就是当事情变得棘手时,因为这需要服务订阅或轮询客户端轮询来检查作业状态。以下可能会有所帮助:http://stackoverflow.com/questions/1537302/subscribe-to-events-within-a-wcf-service –

+0

@RickStrahl当流程完成时,我确实需要通知客户。但是,他们有一套自己的WCF服务,我可以将这些结果发布到。听起来好像使用代理是最简单的方法。 –

回答

1

有很多方法可以完成此操作,具体取决于您想要执行的操作以及您正在使用的技术(例如,除非您使用silverlight,否则您可能不需要让应用程序异步调用该服务)实现你的目标将是让你的服务方法启动一个线程来执行大量的处理并立即返回。

另一种方法是创建某种请求(例如,在某种数据存储中创建条目)并返回。另一个过程(例如,Windows服务等)可以接收请求并执行处理。

+0

所以你建议我做一些事情,比如创建一个委托来处理所有繁重的工作,并在发回初始响应之前调用BeginInvoke? –

+0

是的。线程的职责之一是在完成处理任务时通知他们结束。 – Maciej

+0

你可能想要考虑使用一个线程池,如[本帖]所示(http://stackoverflow.com/questions/2240251/wcf-is-it-safe-to-spawn-an-asynchronous-worker-thread-上的服务器) – Maciej

1

任何WCF服务可以由异步 -

一个有关WCF的好处之一是,你可以写同步服务。当您在客户端添加ServiceReference时,您可以选择生成异步方法。

这会自动使服务调用异步。该服务完成后将返回,但客户端将获得两种方法 - BeginXXX和EndXXX,以及XXXAsync +一个XXXCompleted事件,它们都允许完全异步操作。

+0

这里的问题是我不控制客户端代码。客户端实际上创建了我的WCF服务必须遵守的接口,并且从我所知道的情况来看,他们只是想将消息发送到我的WCF服务并立即响应。然后,当我的服务器成功处理了初始请求时,他们希望它发送一个单独的请求到他们的最后。 实质上,他们希望我的WCF服务异步工作,而不是更改其客户端代码以异步调用我的服务。 –