1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2025-06-09 08:56:13 +00:00

Socket reconnecting fix

This commit is contained in:
Jan Korf 2018-12-28 19:56:51 +01:00
parent 90dac4a0d6
commit acb8f6af59
4 changed files with 26 additions and 10 deletions

View File

@ -7,7 +7,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>CryptoExchange.Net</PackageId> <PackageId>CryptoExchange.Net</PackageId>
<Authors>JKorf</Authors> <Authors>JKorf</Authors>
<PackageVersion>2.0.3</PackageVersion> <PackageVersion>2.0.5</PackageVersion>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageProjectUrl>https://github.com/JKorf/CryptoExchange.Net</PackageProjectUrl> <PackageProjectUrl>https://github.com/JKorf/CryptoExchange.Net</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/JKorf/CryptoExchange.Net/blob/master/LICENSE</PackageLicenseUrl> <PackageLicenseUrl>https://github.com/JKorf/CryptoExchange.Net/blob/master/LICENSE</PackageLicenseUrl>

View File

@ -14,6 +14,7 @@ namespace CryptoExchange.Net.Interfaces
int Id { get; } int Id { get; }
bool ShouldReconnect { get; set; } bool ShouldReconnect { get; set; }
bool Reconnecting { get; set; }
Func<byte[], string> DataInterpreter { get; set; } Func<byte[], string> DataInterpreter { get; set; }
DateTime? DisconnectTime { get; set; } DateTime? DisconnectTime { get; set; }
string Url { get; } string Url { get; }

View File

@ -169,6 +169,11 @@ namespace CryptoExchange.Net
{ {
if (socket.ShouldReconnect) 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"); log.Write(LogVerbosity.Info, $"Socket {socket.Id} Connection lost, will try to reconnect");
Task.Run(() => Task.Run(() =>
{ {
@ -191,6 +196,7 @@ namespace CryptoExchange.Net
lock (sockets) lock (sockets)
subscription = sockets.Single(s => s.Socket == socket); subscription = sockets.Single(s => s.Socket == socket);
socket.Reconnecting = false;
if (!SocketReconnect(subscription, DateTime.UtcNow - time.Value)) if (!SocketReconnect(subscription, DateTime.UtcNow - time.Value))
socket.Close().Wait(); // Close so we end up reconnecting again socket.Close().Wait(); // Close so we end up reconnecting again
else else

View File

@ -32,7 +32,10 @@ namespace CryptoExchange.Net.Sockets
public int Id { get; } public int Id { get; }
public DateTime? DisconnectTime { get; set; } public DateTime? DisconnectTime { get; set; }
public bool ShouldReconnect { get; set; } public bool ShouldReconnect { get; set; }
public bool Reconnecting { get; set; }
public string Url { get; } public string Url { get; }
public bool IsClosed => socket.State == WebSocketState.Closed; public bool IsClosed => socket.State == WebSocketState.Closed;
public bool IsOpen => socket.State == WebSocketState.Open; public bool IsOpen => socket.State == WebSocketState.Open;
@ -115,14 +118,17 @@ namespace CryptoExchange.Net.Sockets
{ {
while (true) while (true)
{ {
if (socket == null || socket.State != WebSocketState.Open) lock (socketLock)
return;
if (DateTime.UtcNow - LastActionTime > Timeout)
{ {
log.Write(LogVerbosity.Warning, $"No data received for {Timeout}, reconnecting socket"); if (socket == null || socket.State != WebSocketState.Open)
Close().Wait(); return;
return;
if (DateTime.UtcNow - LastActionTime > Timeout)
{
log.Write(LogVerbosity.Warning, $"No data received for {Timeout}, reconnecting socket");
Close().ConfigureAwait(false);
return;
}
} }
Thread.Sleep(500); Thread.Sleep(500);
@ -165,8 +171,11 @@ namespace CryptoExchange.Net.Sockets
public virtual void Reset() public virtual void Reset()
{ {
socket.Dispose(); lock (socketLock)
socket = null; {
socket?.Dispose();
socket = null;
}
} }
public virtual void Send(string data) public virtual void Send(string data)