Я создал службу Windows Communication Foundation (в данном случае appDomain - это приложение Windows Forms), которая инициализирует свой класс 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.");
Я бы хотел, чтобы служба инициализировала синглтон-класс одним вызовом, чтобы 1-й клиент, отправивший запрос, не ожидал выполнения конфигурации и инициализации; данные для обновления при запуске программы.
Сразу после "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 выполняла вызов к себе в том же домене приложения, или это разумно нежелательно?
Есть ли причины отказаться от этого кода для самостоятельного вызова и просто жить с сервисным вызовом 1-го клиента?