SignalR withAutomaticReconnect满足条件后如何销毁?重试方法仍执行
如何彻底停用SignalR的withAutomaticReconnect功能
问题分析
你之前尝试的connection.stop()、connection.withAutomaticReconnect(null)及置空连接引用均无效,核心原因有两点:
withAutomaticReconnect是仅在HubConnectionBuilder阶段生效的配置,实例化后的HubConnection对象没有这个方法,所以调用connection.withAutomaticReconnect(null)完全不起作用。connection.stop()是异步方法,未等待其执行完成就进行后续操作,会导致重连逻辑仍在后台运行。
正确解决方案
要彻底终止自动重连,需按以下步骤执行:
异步等待连接停止完成
必须确保stop()执行完毕,否则重连定时器可能仍在运行:await connection.stop();移除重连相关的事件监听
SignalR的自动重连逻辑绑定在close、reconnecting等事件上,移除这些监听可以终止后续重连尝试:// 移除所有与重连相关的系统事件监听 connection.off("close"); connection.off("reconnecting"); connection.off("reconnected");清除连接引用避免内存泄漏
最后置空连接实例,彻底释放资源:connection = null;
完整示例代码
const connection = new signalR.HubConnectionBuilder() .withUrl(socketServerUrl, { withCredentials: false, skipNegotiation: true, transport: signalR.HttpTransportType.WebSockets, }) .withAutomaticReconnect({ nextRetryDelayInMilliseconds: ({ elapsedMilliseconds }) => { // 自定义重连延迟逻辑 }, }) .configureLogging(signalR.LogLevel.Information) .build(); // 游戏会话过期时的处理函数 async function handleSessionExpired() { // 仅当连接未断开时执行停止操作 if (connection.state !== signalR.HubConnectionState.Disconnected) { await connection.stop(); } // 移除所有重连相关事件监听 connection.off("close"); connection.off("reconnecting"); connection.off("reconnected"); // 清除连接引用 connection = null; } // 触发处理逻辑 if (isGameSessionExpired) { handleSessionExpired(); }
额外说明
如果后续需要重新建立连接,不要复用旧的连接实例,而是重新创建一个不带withAutomaticReconnect配置的新连接,从根源上避免自动重连逻辑生效。
内容的提问来源于stack exchange,提问作者Zhivko Zhelev
相关产品推荐
相关产品推荐

