当应用处于活动状态时,保持WebSocket和一些事件处理程序存活

本文关键字:事件处理 程序 WebSocket 保持 应用 活动状态 | 更新日期: 2023-09-27 18:05:03

我用的是Caliburn。Micro构建一个Windows 8.1通用应用程序。该应用程序使用WebSocket连接到web服务。我希望这个连接,一旦建立,保持活只要应用程序是活跃的,无论用户在哪个页面。

目前我是这样做的:

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

,它似乎工作,因为我想。我可以在我的视图模型中注入它,连接仍然是打开的,即使没有注入服务的视图模型处于活动状态,它也会接收消息。然而,我有点好奇,如果这是正确的方式(如果它实际上做什么我期待)?

其次,我使用连接管理器解析从WebSocket连接返回的JSON,并创建相应的类,如RandomThingHappened,并使用来自Caliburn.Micro的事件聚合器服务广播这些。对这些感兴趣的人可以订阅并做他们想做的事情。但是,有一些消息我希望处理,而不管用户在哪个视图上。这可能吗?我也考虑过为此创建单例,只是要确保在某个地方实例化它们。然而,这似乎有点……风险。

建议吗?

当应用处于活动状态时,保持WebSocket和一些事件处理程序存活

不太确定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将你的事件发布到所有监听类。

你可以在这里阅读更多事件聚合器