Поддерживайте работу WebSocket и некоторых обработчиков событий, пока приложение активно

1

Я использую Caliburn.Micro для создания универсального приложения Windows 8.1. Приложение подключается к веб-службе с помощью WebSocket. Я хотел бы, чтобы эта связь была создана после того, как она была сохранена до тех пор, пока приложение активно, независимо от того, на какой странице пользователь включен.

В настоящее время я делаю это так:

container = new WinRTContainer();
container.Singleton<IConnectionService, ConnectionService>();

и, похоже, он работает так, как я хочу. Я могу ввести его в мои модели просмотра, и соединение все еще открыто и оно получает сообщения, даже если модель представления, которая не вводит услугу, активна. Мне, однако, немного любопытно, если это правильный способ (и если он действительно делает то, что я ожидаю)?

Во-вторых, я использую диспетчер соединений для анализа JSON, возвращаемого из соединения WebSocket, и создания соответствующих классов, таких как RandomThingHappened и их трансляции с использованием службы агрегатора событий от Caliburn.Micro. Заинтересованные в них могут подписаться и сделать то, что они хотят. Тем не менее, есть некоторые сообщения, которые я хотел бы обрабатывать независимо от того, с каким видом пользователь включен. Это возможно? Я думал о создании синглов для этого, а также просто удостоверяюсь, что они где-то создаются. Это, однако, кажется немного... рискованным.

Предложения?

Теги:
caliburn.micro
windows-runtime

1 ответ

1

Не совсем уверен в websocket, но

Я использую следующие способы для моей службы WCF (немой терминал должен быть всегда подключен, потому что служба WCF будет выталкивать сообщение на подключенный терминал с помощью обратного вызова

    [OperationContract(IsOneWay = true)]
    void KeepConnection();

и в вашем клиенте используйте таймер для продолжения вызова службы

   var timer = new DispatcherTimer { Interval = new TimeSpan(0, 0, 50) };
        timer.Start();
        timer.Tick += (sender, args) =>
            {
                try
                {
                    if (this.client.State == CommunicationState.Faulted)
                    {
                        this.RegisterTerminal();
                    }

                    this.client.KeepConnection();
                }
                catch
                {
                    throw new Exception("Failed to establish connection with server");
                }
            };

Что касается трансляции, вы можете использовать EventAggregator для публикации своего события для всего класса прослушивания.

вы можете прочитать больше здесь Event Aggregator

Ещё вопросы

Сообщество Overcoder
Наверх
Меню