我有一个托管单件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语句有关?
答案 0 :(得分:1)
WCF服务的代理对象将在使用块的末尾处理,但这不会发生,直到客户端收到服务收到其消息的确认。似乎服务在执行方法体中的所有代码(包括处理大量数据)之前不发送确认,因此客户端上的执行在使用块结束时等待,直到服务完成处理
我有两种方法可以解决这个问题:
使代理对象成为客户端中的全局变量。
关闭服务器中的线程以处理长处理,允许服务器方法立即返回客户端正在等待的确认。
答案 1 :(得分:0)
如果您的目标是在WCF调用完成后继续执行其他工作,请右键单击您的服务引用并点击“更新服务引用”。选中生成异步方法的选项。
然后将其称为wcfServiceProxy.RefreshDisplayCacheFromSourceAsync();
如果您希望在完成后收到通知,您也可以为其添加事件处理程序。