Невозможно получить данные от клиента WCF - PullRequest
1 голос
/ 20 апреля 2010

Я занимаюсь разработкой библиотеки 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;
}

1 Ответ

0 голосов
/ 21 апреля 2010

Я даже не дошел до того, что мне понадобится обратный звонок. Я планирую имитировать функциональность оконного таймера, чтобы обеспечить таймеры, которые могут работать с ускоренными отметками времени. Вот где будет использоваться обратный вызов.

Метод GetTime - это метод для получения текущего времени (для получения текущего системного времени используйте его как метод DateTime.Now).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...