WCF serviceType作为单例实例

时间:2009-07-13 10:24:05

标签: c# wcf singleton appdomain

我已经创建了一个Windows Communication Foundation服务(在这种情况下,appDomain是一个Windows窗体应用程序),它将serviceType类初始化为单例:

启动服务。从客户端拨打电话。但是如果服务使用上面的代码调用自己(“//第一次调用服务?”),我得到一个System.TimeoutException。

private static myDataService.DataProvider.CustomSingletonClass obs;

public DataProviderServiceType()
{

    //Create the object if needed.  This should only be required first time.
    if (obs == null)
    {
        obs = new myDataService.DataProvider.CustomSingletonClass();
        //Instruct the class to read its configuration and initialize.                       

        obs.initializeSingletonClass(null);

    }

}

单例类有一个定时器对象,它将在初始化时启动。因此,一旦客户端对服务进行了调用,就会实例化该类,启动定时器并且对象将继续存在,并且定时器对象会定期触发。

对于上下文,计时器的事件将更新单例的属性。目的是让单例类定期执行计算,将数据保存在其属性中,并将属性中的任何内容返回给调用客户端。 这样,执行定期(基于时间)计算的调用受到限制,并且所有客户端都会收到相同的更新数据。

问题是托管服务后,只需要一个客户端就可以创建单例实例并启动计时器。

SetListText("Starting Service...");
host_DataService = new ServiceHost(serviceType_Data);
host_DataService.Open();
SetListText("Service is now available.");

我希望服务通过一次调用初始化单例类,这样第一个发出请求的客户端就不必等待配置和初始化了。程序启动时要刷新的数据。 在“SetListText(”服务现在可用。“)之后;”;我有以下内容:

//Make the 1st call to the service?
EndpointAddress endpointAddress = new     EndpointAddress("http://localhost:8000/myDataService/DataProvider/TimedCalculator");
BasicHttpBinding serviceBinding = new BasicHttpBinding();

serviceBinding.CloseTimeout = new TimeSpan(0, 1, 0);
serviceBinding.OpenTimeout = new TimeSpan(0, 1, 0);
serviceBinding.ReceiveTimeout = new TimeSpan(0, 10, 0);
serviceBinding.SendTimeout = new TimeSpan(0, 1, 0);

DataProviderClient client = new DataProviderClient (serviceBinding, endpointAddress);
String[][] ArrStr = client.retrieveList();

有没有办法让WCF服务在同一个appDomain中调用自己,还是这个合理的不合需要? 有没有理由放弃这个自我调用代码,只是忍受第一个客户的服务电话?

1 个答案:

答案 0 :(得分:1)

我会这样做有点不同。试试这个:

  • 使用单件WCF服务删除
  • 使用Enterprise Library进行缓存
  • 在您的WCF服务中检查缓存中的数据是否足够新,如果是,则返回,如果没有获取/重新计算数据。
  • 创建一个以特定时间间隔轮询WCF服务的Windows服务。

如果时间间隔足够短,通常Windows服务正在进行再生工作。

这种模式也有变化:

  • Windows服务调用重新缓存数据服务
  • 您使用缓存代理产品
  • 而不是Windows服务