diff --git a/CryptoExchange.Net/Sockets/SocketConnection.cs b/CryptoExchange.Net/Sockets/SocketConnection.cs index 7145eb0..3f7b9e2 100644 --- a/CryptoExchange.Net/Sockets/SocketConnection.cs +++ b/CryptoExchange.Net/Sockets/SocketConnection.cs @@ -152,11 +152,23 @@ 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. + } if (!socketClient.ContinueOnQueryResponse) return; handledResponse = true; @@ -238,7 +250,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); }