我已经创建了一个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中调用自己,还是这个合理的不合需要? 有没有理由放弃这个自我调用代码,只是忍受第一个客户的服务电话?
答案 0 :(得分:1)
我会这样做有点不同。试试这个:
如果时间间隔足够短,通常Windows服务正在进行再生工作。
这种模式也有变化: