From 7bd0fdaf19ff4110f34c74dbc8aa83864e19bd32 Mon Sep 17 00:00:00 2001 From: Eric Garnier Date: Sat, 19 Dec 2020 17:48:42 +0100 Subject: [PATCH 1/2] fix for issue 71 --- CryptoExchange.Net/Sockets/SocketConnection.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CryptoExchange.Net/Sockets/SocketConnection.cs b/CryptoExchange.Net/Sockets/SocketConnection.cs index 5d30915..625e7a2 100644 --- a/CryptoExchange.Net/Sockets/SocketConnection.cs +++ b/CryptoExchange.Net/Sockets/SocketConnection.cs @@ -153,6 +153,10 @@ namespace CryptoExchange.Net.Sockets if (pendingRequest.Check(tokenData)) { pendingRequests.Remove(pendingRequest); + if (pendingRequest.Result == null) + { + continue; // A previous timeout. + } if (!socketClient.ContinueOnQueryResponse) return; handledResponse = true; From 0db71a3fb6713b1d27fd47ab9d51737d33f46b82 Mon Sep 17 00:00:00 2001 From: Eric Garnier Date: Sun, 20 Dec 2020 10:59:38 +0100 Subject: [PATCH 2/2] Protect pendingRequest list from concurrent access. --- CryptoExchange.Net/Sockets/SocketConnection.cs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/CryptoExchange.Net/Sockets/SocketConnection.cs b/CryptoExchange.Net/Sockets/SocketConnection.cs index 625e7a2..d064b6a 100644 --- a/CryptoExchange.Net/Sockets/SocketConnection.cs +++ b/CryptoExchange.Net/Sockets/SocketConnection.cs @@ -148,11 +148,19 @@ namespace CryptoExchange.Net.Sockets } var handledResponse = false; - foreach (var pendingRequest in pendingRequests.ToList()) + PendingRequest[] requests; + lock(pendingRequests) + { + requests = pendingRequests.ToArray(); + } + foreach (var pendingRequest in requests) { if (pendingRequest.Check(tokenData)) { - pendingRequests.Remove(pendingRequest); + lock (pendingRequests) + { + pendingRequests.Remove(pendingRequest); + } if (pendingRequest.Result == null) { continue; // A previous timeout. @@ -237,7 +245,10 @@ namespace CryptoExchange.Net.Sockets public virtual Task SendAndWait(T obj, TimeSpan timeout, Func handler) { var pending = new PendingRequest(handler, timeout); - pendingRequests.Add(pending); + lock (pendingRequests) + { + pendingRequests.Add(pending); + } Send(obj); return pending.Event.WaitOneAsync(timeout); }