0

我有一个 Windows 服务托管一个缓存大量数据的单例 WCF 服务。在启动 Windows 服务时,我正在执行以下操作:

// start client service
        wcfService= new ServiceHost(typeof(MyWcfService));
        wcfService.Open();

        using (HostedServiceReference.WcfServiceProxy wcfServiceProxy = new HostedServiceReference.WcfClientServiceProxy())
        {
            wcfServiceProxy.RefreshDisplayCacheFromSource();
            // 1st echo to console
            Console.WriteLine("Display Cache Refreshed"));
        }
        // 2nd echo to console
        Console.WriteLine("Begin other processing"))

我在服务合同中配置了如下方法:

[OperationContract(IsOneWay=true)]
    void RefreshDisplayCacheFromSource();

我原以为会立即看到控制台中显示的第一个和第二个回声,但我实际看到的只是第一个回声。在我的“一劳永逸”方法完成它的长时间操作之前,不会显示第二行。

谁能解释一下后台发生了什么?

到目前为止我的理论:

wcf 服务在单例模式下的运行是否阻塞了托管它的服务?

它与 using 语句有关吗?

4

2 回答 2

1

WCF 服务的代理对象将在 using 块的末尾被释放,但这不会发生,直到客户端收到服务收到其消息的确认。似乎服务在执行完方法体中的所有代码(包括处理大量数据)之后才发送确认,因此客户端上的执行在 using 块的末尾等待,直到服务完成加工。

我可以使用两种方法来解决此问题:

使代理对象成为客户端中的全局变量。

在服务器中分离一个线程来处理长处理,允许服务器方法在客户端等待确认的情况下立即返回。

于 2011-05-23T13:53:43.153 回答
0

如果您的目标是在 WCF 调用执行其操作时能够继续进行其他工作,请右键单击您的服务引用并点击“更新服务引用”。选中生成异步方法的选项。

然后将其称为 wcfServiceProxy.RefreshDisplayCacheFromSourceAsync();

如果您想在完成时收到通知,您也可以为其添加事件处理程序。

于 2011-05-23T13:59:37.627 回答