WCF服务中的异步调用

时间:2014-03-24 05:58:51

标签: c# asp.net wcf asynchronous odata

我们需要在数据服务的InitializeService方法中执行一些长时间运行的代码。目前,对数据服务的第一次调用会触发代码,但在长时间运行的代码完成之前不会收到响应。客户端无需等待此操作完成。我试图使用一个新的线程来执行代码,但是在运行代码时,我们正在替换服务器上的一些文件,这些文件似乎会杀死线程并导致它被炸毁。如果我没有在一个线程中运行它运行正常,但InitializeService方法需要很长时间才能完成。

是否还有其他方法可以异步运行此代码(想到可能有一种方法以与客户端相同的方式调用另一种方法)?

提前致谢。

1 个答案:

答案 0 :(得分:1)

所有WCF通信基本上都是异步的。每次调用都会在主机上旋转自己的线程并开始处理。与我们中的许多人一样,您遇到的问题是客户端在主机完成工作之前会超时,除了将超时设置为一些荒谬的时间之外,没有简单的方法。

最好将处理分成两个或多个部分,启动初始化过程并在单独的步骤中完成初始化过程,如下所示:

您可以尝试使用具有回调功能的双工WCF服务的一个选项。换句话说,客户端“A”调用主机并启动初始化例程,但主机立即向客户端发回IntializationStart = True的值,以便客户端不会等待超时。然后,当主机完成编译文件时,它会调用客户端(它有自己的侦听器)并发送初始化已准备好的消息。然后客户端调用主机并下载已处理的文件。

这适用于PC到服务器或服务器到服务器。

另一种选择可以这样工作:客户端“A”联系主机,主机启动初始化例程,再次发回IntializationStarted = True。主机为客户端“A”设置FilesReady = False的内部(DB)值,直到所有文件都完成。此时,主机将其内部值设置为FilesReady = True。同时,客户端在一个计时器上,每分钟轮询一次主机,直到它最终收到FilesReady = True,然后下载等待的文件。

如果您正在谈论iPhone到服务器或Android到服务器,那么这是一条更好的路线。

你跟着?