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();