From acb8f6af597333eeabcd08e961598f2968039be0 Mon Sep 17 00:00:00 2001 From: Jan Korf Date: Fri, 28 Dec 2018 19:56:51 +0100 Subject: [PATCH] Socket reconnecting fix --- CryptoExchange.Net/CryptoExchange.Net.csproj | 2 +- CryptoExchange.Net/Interfaces/IWebsocket.cs | 1 + CryptoExchange.Net/SocketClient.cs | 6 +++++ CryptoExchange.Net/Sockets/BaseSocket.cs | 27 +++++++++++++------- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/CryptoExchange.Net/CryptoExchange.Net.csproj b/CryptoExchange.Net/CryptoExchange.Net.csproj index 8dd848a..ae1620c 100644 --- a/CryptoExchange.Net/CryptoExchange.Net.csproj +++ b/CryptoExchange.Net/CryptoExchange.Net.csproj @@ -7,7 +7,7 @@ CryptoExchange.Net JKorf - 2.0.3 + 2.0.5 false https://github.com/JKorf/CryptoExchange.Net https://github.com/JKorf/CryptoExchange.Net/blob/master/LICENSE diff --git a/CryptoExchange.Net/Interfaces/IWebsocket.cs b/CryptoExchange.Net/Interfaces/IWebsocket.cs index 3c6829e..a208d66 100644 --- a/CryptoExchange.Net/Interfaces/IWebsocket.cs +++ b/CryptoExchange.Net/Interfaces/IWebsocket.cs @@ -14,6 +14,7 @@ namespace CryptoExchange.Net.Interfaces int Id { get; } bool ShouldReconnect { get; set; } + bool Reconnecting { get; set; } Func DataInterpreter { get; set; } DateTime? DisconnectTime { get; set; } string Url { get; } diff --git a/CryptoExchange.Net/SocketClient.cs b/CryptoExchange.Net/SocketClient.cs index 4e34cb5..e3e379e 100644 --- a/CryptoExchange.Net/SocketClient.cs +++ b/CryptoExchange.Net/SocketClient.cs @@ -169,6 +169,11 @@ namespace CryptoExchange.Net { if (socket.ShouldReconnect) { + if (socket.Reconnecting) + return; // Already reconnecting + + socket.Reconnecting = true; + log.Write(LogVerbosity.Info, $"Socket {socket.Id} Connection lost, will try to reconnect"); Task.Run(() => { @@ -191,6 +196,7 @@ namespace CryptoExchange.Net lock (sockets) subscription = sockets.Single(s => s.Socket == socket); + socket.Reconnecting = false; if (!SocketReconnect(subscription, DateTime.UtcNow - time.Value)) socket.Close().Wait(); // Close so we end up reconnecting again else diff --git a/CryptoExchange.Net/Sockets/BaseSocket.cs b/CryptoExchange.Net/Sockets/BaseSocket.cs index e152e7c..f3da7d0 100644 --- a/CryptoExchange.Net/Sockets/BaseSocket.cs +++ b/CryptoExchange.Net/Sockets/BaseSocket.cs @@ -32,7 +32,10 @@ namespace CryptoExchange.Net.Sockets public int Id { get; } public DateTime? DisconnectTime { get; set; } + public bool ShouldReconnect { get; set; } + public bool Reconnecting { get; set; } + public string Url { get; } public bool IsClosed => socket.State == WebSocketState.Closed; public bool IsOpen => socket.State == WebSocketState.Open; @@ -115,14 +118,17 @@ namespace CryptoExchange.Net.Sockets { while (true) { - if (socket == null || socket.State != WebSocketState.Open) - return; - - if (DateTime.UtcNow - LastActionTime > Timeout) + lock (socketLock) { - log.Write(LogVerbosity.Warning, $"No data received for {Timeout}, reconnecting socket"); - Close().Wait(); - return; + if (socket == null || socket.State != WebSocketState.Open) + return; + + if (DateTime.UtcNow - LastActionTime > Timeout) + { + log.Write(LogVerbosity.Warning, $"No data received for {Timeout}, reconnecting socket"); + Close().ConfigureAwait(false); + return; + } } Thread.Sleep(500); @@ -165,8 +171,11 @@ namespace CryptoExchange.Net.Sockets public virtual void Reset() { - socket.Dispose(); - socket = null; + lock (socketLock) + { + socket?.Dispose(); + socket = null; + } } public virtual void Send(string data)