diff --git a/CryptoExchange.Net/CryptoExchange.Net.csproj b/CryptoExchange.Net/CryptoExchange.Net.csproj index 24acd50..14241fa 100644 --- a/CryptoExchange.Net/CryptoExchange.Net.csproj +++ b/CryptoExchange.Net/CryptoExchange.Net.csproj @@ -16,7 +16,7 @@ - + diff --git a/CryptoExchange.Net/SocketClient.cs b/CryptoExchange.Net/SocketClient.cs index 6dca89c..8fa26a8 100644 --- a/CryptoExchange.Net/SocketClient.cs +++ b/CryptoExchange.Net/SocketClient.cs @@ -67,6 +67,9 @@ namespace CryptoExchange.Net socket.DataInterpreter = dataInterpreter; socket.OnClose += () => { + foreach (var sub in sockets) + sub.ResetEvents(); + SocketOnClose(socket); }; socket.OnError += (e) => diff --git a/CryptoExchange.Net/Sockets/SocketSubscription.cs b/CryptoExchange.Net/Sockets/SocketSubscription.cs index b687acf..e19a0ba 100644 --- a/CryptoExchange.Net/Sockets/SocketSubscription.cs +++ b/CryptoExchange.Net/Sockets/SocketSubscription.cs @@ -65,7 +65,12 @@ namespace CryptoExchange.Net.Sockets public void SetEvent(string name, bool success, Error error) { - Events.SingleOrDefault(e => e.Name == name)?.Set(success, error); + var waitingEvent = waitingForEvents.SingleOrDefault(e => e.Name == name); + if (waitingEvent != null) + { + waitingEvent.Set(success, error); + waitingForEvents.Remove(waitingEvent); + } } public void SetEvent(int id, bool success, Error error) @@ -85,23 +90,24 @@ namespace CryptoExchange.Net.Sockets public Task> WaitForEvent(string name, int timeout) { - return Task.Run(() => - { - var evnt = Events.Single(e => e.Name == name); - waitingForEvents.Add(evnt); - return evnt.Wait(timeout); - }); + var evnt = Events.Single(e => e.Name == name); + waitingForEvents.Add(evnt); + return Task.Run(() => evnt.Wait(timeout)); } public Task> WaitForEvent(string name, int id, int timeout) { - return Task.Run(() => - { - var evnt = Events.Single(e => e.Name == name); - evnt.WaitingId = id; - waitingForEvents.Add(evnt); - return evnt.Wait(timeout); - }); + var evnt = Events.Single(e => e.Name == name); + evnt.WaitingId = id; + waitingForEvents.Add(evnt); + return Task.Run(() => evnt.Wait(timeout)); + } + + public void ResetEvents() + { + foreach (var waiting in new List(waitingForEvents)) + waiting.Set(false, new UnknownError("Connection reset")); + waitingForEvents.Clear(); } public async Task Close()