【问题标题】:Asynchronous calls within a WCF ServiceWCF 服务中的异步调用
【发布时间】:2014-03-24 05:58:50
【问题描述】:

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

是否有任何其他方法可以异步运行此代码(在想也许有一种方法可以以与客户端相同的方式调用另一个方法)?

提前致谢。

【问题讨论】:

  • 如果 InitializeService 是构造函数的一部分(某处),构造函数在使用线程时有特殊的约束——它不能使用 await 构造生成线程并等待它完成。我们已经完成了长时间运行的初始化过程,方法是在不等待完成的情况下生成它们,并在完成时让线程发出 WaitHandle 等信号,以便依赖于初始化资源(例如文件)的代码在信号量之前不会触发发出信号。

标签: c# asp.net wcf asynchronous odata


【解决方案1】:

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

最好将您的处理分成两个或更多部分,分别开始初始化过程和完成初始化过程,如下所示:

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

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

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

如果您谈论的是 iPhone 到服务器或 Android 到服务器,那么这是一个更好的途径。

你跟着?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多