C# WCF serviceType作为单例实例 我创建了一个Windows通信基础服务(在本例中是一个Windows窗体应用程序),将其Service Type类初始化为一个单独的:

C# WCF serviceType作为单例实例 我创建了一个Windows通信基础服务(在本例中是一个Windows窗体应用程序),将其Service Type类初始化为一个单独的:,c#,wcf,singleton,appdomain,C#,Wcf,Singleton,Appdomain,开始服务工作。从客户那里打电话是有效的。但是,如果服务使用上述代码(“//对服务进行第一次调用?”)对自身进行调用,则会得到System.TimeoutException private static myDataService.DataProvider.CustomSingletonClass obs; public DataProviderServiceType() { //Create the object if needed. This should only be req

开始服务工作。从客户那里打电话是有效的。但是,如果服务使用上述代码(“//对服务进行第一次调用?”)对自身进行调用,则会得到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);

    }

}
singleton类有一个计时器对象,它将在初始化时启动。因此,一旦客户机对服务进行了调用,类就被实例化,计时器被启动,对象将继续存在,其计时器对象将定期触发

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

问题是,一旦托管了服务,就只需要一个客户端调用要创建的singleton实例并启动计时器

SetListText("Starting Service...");
host_DataService = new ServiceHost(serviceType_Data);
host_DataService.Open();
SetListText("Service is now available.");
我希望服务通过一个调用初始化singleton类,这样第一个发出请求的客户端就不必等待配置和初始化的发生;程序启动时要刷新的数据。 在“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中调用自身,或者这是合理不可取的?
是否有理由放弃这个自呼代码,只接受第一个客户的服务呼叫?

我会做一些不同的事情。试试这个:

  • 使用单例WCF服务删除
  • 使用企业库进行缓存
  • 在您的WCF服务中,检查缓存中的数据是否足够新,如果足够新,则返回数据,如果没有,则获取/重新计算数据
  • 创建以特定时间间隔轮询WCF服务的windows服务
如果时间间隔足够短,windows服务通常会执行重新生成的工作

这种模式也有一些变化:

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