Я занимаюсь разработкой библиотеки DLL, которая будет предоставлять синхронизированные метки времени для нескольких приложений, работающих на одном компьютере. Временные метки изменяются в потоке, который использует высокопроизводительный таймер и скаляр, чтобы обеспечить видимость движения быстрее, чем в реальном времени. По понятным причинам мне нужен только 1 экземпляр этой библиотеки времени, и я подумал, что мог бы использовать WCF для других процессов, чтобы подключиться к нему и опрашивать метки времени, когда они захотят. Однако, когда я подключаюсь, я никогда не получаю правильную временную метку, просто пустое DateTime. Я должен отметить, что библиотека работает. Первоначальная реализация представляла собой одну DLL, которую включало каждое приложение, и каждое синхронизировалось с помощью сообщений Windows. Я вполне уверен, что это как-то связано с тем, как я настраиваю WCF, и я все еще новичок. Вот определения контракта:
public interface ITimerCallbacks{
[OperationContract(IsOneWay = true)]
void TimerElapsed(String id);
}
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ITimerCallbacks))]
public interface ISimTime
{
[OperationContract]
DateTime GetTime();
}
Вот мое определение класса:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class SimTimeServer: ISimTime
Настройка хоста:
// set up WCF interprocess comms
host = new ServiceHost(typeof(SimTimeServer), new Uri[] { new Uri("net.pipe://localhost") });
host.AddServiceEndpoint(typeof(ISimTime), new NetNamedPipeBinding(), "SimTime");
host.Open();
и реализация функции интерфейса на стороне сервера:
public DateTime GetTime()
{
if (ThreadMutex.WaitOne(20))
{
RetTime = CurrentTime;
ThreadMutex.ReleaseMutex();
}
return RetTime;
}
Наконец, реализация на стороне клиента:
Callbacks myCallbacks = new Callbacks();
DuplexChannelFactory<ISimTime> pipeFactory =
new DuplexChannelFactory<ISimTime>(myCallbacks, new NetNamedPipeBinding(),
new EndpointAddress("net.pipe://localhost/SimTime"));
ISimTime pipeProxy = pipeFactory.CreateChannel();
while (true)
{
string str = Console.ReadLine();
if (str.ToLower().Contains("get"))
Console.WriteLine(pipeProxy.GetTime().ToString());
else if (str.ToLower().Contains("exit"))
break;
}