From 1c33e297e71f6ba3e7eff98703e36f27c971855c Mon Sep 17 00:00:00 2001 From: JKorf Date: Sat, 18 Feb 2023 10:41:26 +0100 Subject: [PATCH] Test some changes for robustness --- .../Sockets/CryptoExchangeWebSocketClient.cs | 68 ++++++++++++++++--- .../Sockets/SocketConnection.cs | 2 +- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs b/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs index c919456..255b0f1 100644 --- a/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs +++ b/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs @@ -211,8 +211,16 @@ namespace CryptoExchange.Net.Sockets while (_closeTask == null) await Task.Delay(50).ConfigureAwait(false); - await _closeTask.ConfigureAwait(false); - _closeTask = null; + await _closeSem.WaitAsync().ConfigureAwait(false); + try + { + await _closeTask.ConfigureAwait(false); + _closeTask = null; + } + finally + { + _closeSem.Release(); + } if (!Parameters.AutoReconnect) { @@ -285,8 +293,19 @@ namespace CryptoExchange.Net.Sockets return; _log.Write(LogLevel.Debug, $"Socket {Id} reconnect requested"); - _closeTask = CloseInternalAsync(); - await _closeTask.ConfigureAwait(false); + await _closeSem.WaitAsync().ConfigureAwait(false); + try + { + if (_processState != ProcessState.Processing) + return; + + _closeTask = CloseInternalAsync(); + await _closeTask.ConfigureAwait(false); + } + finally + { + _closeSem.Release(); + } } /// @@ -430,8 +449,19 @@ namespace CryptoExchange.Net.Sockets { // Connection closed unexpectedly, .NET framework OnError?.Invoke(ioe); - if (_closeTask?.IsCompleted != false) - _closeTask = CloseInternalAsync(); + await _closeSem.WaitAsync().ConfigureAwait(false); + try + { + if (_processState != ProcessState.Processing) + return; + + if (_closeTask?.IsCompleted != false) + _closeTask = CloseInternalAsync(); + } + catch + { + _closeSem.Release(); + } break; } } @@ -488,8 +518,17 @@ namespace CryptoExchange.Net.Sockets { // Connection closed unexpectedly OnError?.Invoke(wse); - if (_closeTask?.IsCompleted != false) - _closeTask = CloseInternalAsync(); + await _closeSem.WaitAsync().ConfigureAwait(false); + try + { + if (_processState == ProcessState.Processing && _closeTask?.IsCompleted != false) + _closeTask = CloseInternalAsync(); + } + catch + { + _closeSem.Release(); + } + break; } @@ -497,8 +536,17 @@ namespace CryptoExchange.Net.Sockets { // Connection closed unexpectedly _log.Write(LogLevel.Debug, $"Socket {Id} received `Close` message"); - if (_closeTask?.IsCompleted != false) - _closeTask = CloseInternalAsync(); + await _closeSem.WaitAsync().ConfigureAwait(false); + try + { + if (_processState == ProcessState.Processing && _closeTask?.IsCompleted != false) + _closeTask = CloseInternalAsync(); + } + catch + { + _closeSem.Release(); + } + break; } diff --git a/CryptoExchange.Net/Sockets/SocketConnection.cs b/CryptoExchange.Net/Sockets/SocketConnection.cs index 346daec..2964fbf 100644 --- a/CryptoExchange.Net/Sockets/SocketConnection.cs +++ b/CryptoExchange.Net/Sockets/SocketConnection.cs @@ -253,7 +253,7 @@ namespace CryptoExchange.Net.Sockets var reconnectSuccessful = await ProcessReconnectAsync().ConfigureAwait(false); if (!reconnectSuccessful) { - _log.Write(LogLevel.Warning, "Failed reconnect processing, reconnecting again"); + _log.Write(LogLevel.Warning, $"Failed reconnect processing: {reconnectSuccessful.Error}, reconnecting again"); await _socket.ReconnectAsync().ConfigureAwait(false); } else