WCF“Fire and Forget”方法不允许主机执行按预期继续

时间:2011-05-11 12:30:14

标签: wcf fire-and-forget isoneway

我有一个托管单件WCF服务的Windows服务,它可以缓存大量数据。在启动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语句有关?

2 个答案:

答案 0 :(得分:1)

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

我有两种方法可以解决这个问题:

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

关闭服务器中的线程以处理长处理,允许服务器方法立即返回客户端正在等待的确认。

答案 1 :(得分:0)

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

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

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