From 4b6b523b601ca3c331e86179cbc0b0e374fc70e2 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 21 Aug 2025 14:15:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=85=A8=E4=BF=AE=E5=A4=8D=20-=20WebS?= =?UTF-8?q?ocketTransport=20=E7=8E=B0=E5=9C=A8=E5=8F=AF=E4=BB=A5=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E5=9C=B0=E5=A4=9A=E6=AC=A1=E8=BF=9E=E6=8E=A5=E5=92=8C?= =?UTF-8?q?=E6=96=AD=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/WebSocketTransport.cs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/CoreAgent.WebSocketTransport/Services/WebSocketTransport.cs b/CoreAgent.WebSocketTransport/Services/WebSocketTransport.cs index dd97001..09286f2 100644 --- a/CoreAgent.WebSocketTransport/Services/WebSocketTransport.cs +++ b/CoreAgent.WebSocketTransport/Services/WebSocketTransport.cs @@ -76,17 +76,27 @@ public class WebSocketTransport : IWebSocketTransport await _connectionSemaphore.WaitAsync(cancellationToken); try { - if (_isConnected) + // 检查连接状态,包括 WebSocket 连接状态 + if (_isConnected && _connection.IsConnected) { _logger.LogInformation("WebSocket 已连接,跳过重复连接"); return; } + + // 如果状态不一致,强制重置状态 + if (_isConnected && !_connection.IsConnected) + { + _logger.LogWarning("连接状态不一致,强制重置状态"); + _isConnected = false; + } await ConnectInternalAsync(cancellationToken); } catch (Exception ex) { _logger.LogError(ex, "连接 WebSocket 服务器失败: {Url}", _config.Url); + // 确保连接失败时状态正确 + _isConnected = false; throw; } finally @@ -148,6 +158,13 @@ public class WebSocketTransport : IWebSocketTransport _logger.LogInformation("所有后台任务已完成"); } + // 清理后台任务引用 + _sendTask = null; + _receiveTask = null; + _heartbeatTask = null; + _reconnectTask = null; + _logger.LogDebug("后台任务引用已清理"); + // 关闭连接 try { @@ -174,7 +191,9 @@ public class WebSocketTransport : IWebSocketTransport // 不抛出异常,确保不影响连接关闭流程 } + // 重置所有状态 _isConnected = false; + _reconnectAttempts = 0; // 重新创建 CancellationTokenSource 以支持下次连接 RecreateCancellationTokenSource();