我有一个.NET客户端应用程序,如果我的应用程序更改为“已关闭”状态,则会使用HubConnectionManager重试连接到服务器。
在以下情况下似乎效果很好:
HOWEVER ,在情况(2)中,当客户端成功重新连接时,客户端先前订阅的所有事件都不再通过。所以,实际上,客户端已经连接但实际上已经死了。
因此重新连接在所有情况下均可正常工作,但如果我在断开连接后重新连接,则会丢失我的订阅。
因此,我最初尝试捕获StateChanged
事件,并在从Connecting
更改为Connected
后,重新订阅服务器的广播(例如{{1} }})。但是,这似乎不起作用,我担心,如果我不小心,我可能会像使用_hubProxy.On<MachineStatusDto>(UPDATE_MACHINE_STATUS, BroadcastMachineStatus);
多次订阅一样创建内存泄漏。
不确定从这里开始......
答案 0 :(得分:2)
经过进一步调查,并在HubConnectionManager上运行我自己的客户端/服务器后,我意识到我 am 实际上已重新连接并接收订阅。
我的LoB应用程序的警告是我的订阅基于组成员资格。根据MSDN:
&#34;在临时中断后重新连接时,用户 自动重新加入先前分配的组。自动 重新加入组只适用于重新连接,不适用时 建立新连接。&#34;
因此,我正在重新连接成功,并且会收到服务器发送的任何全局消息。但是,在Group
之后重新建立连接时,我必须将我的客户重新添加到各自的DisconnectTimeout
。
这是我使用的代码:
//Somewhere when initializing the connection
_hubConnectionManager.StateChanged += OnHubConnectionManagerOnStateChanged;
//Handler for state change
private void OnHubConnectionManagerOnStateChanged(StateChange st)
{
//When disconnected, set state variable
if (st.NewState == ConnectionState.Disconnected)
{
_wasDisconnected = true;
}
//If disconnected and we re-create connection successfully, re-subscribe to updates.
if (_wasDisconnected && st.OldState == ConnectionState.Connecting && st.NewState == ConnectionState.Connected)
{
SubscribeToMachine(MachineStatusDetails.MachineId);
}
Messenger.Default.Send<ConnectionState>(st.NewState, UIMessageToken.ConnectionState);
}