1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2025-06-09 00:46:19 +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>
<PackageId>CryptoExchange.Net</PackageId>
<Authors>JKorf</Authors>
<PackageVersion>2.0.3</PackageVersion>
<PackageVersion>2.0.5</PackageVersion>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageProjectUrl>https://github.com/JKorf/CryptoExchange.Net</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/JKorf/CryptoExchange.Net/blob/master/LICENSE</PackageLicenseUrl>

View File

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

View File

@ -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

View File

@ -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)