diff --git a/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs b/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs index 47d8c15..0c9dda7 100644 --- a/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs +++ b/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs @@ -258,24 +258,32 @@ namespace CryptoExchange.Net.OrderBook } _subscription = startResult.Data; - _subscription.ConnectionLost += () => - { - log.Write(LogLevel.Warning, $"{Id} order book {Symbol} connection lost"); - Status = OrderBookStatus.Reconnecting; - Reset(); - }; - _subscription.ConnectionClosed += () => - { - log.Write(LogLevel.Warning, $"{Id} order book {Symbol} disconnected"); - Status = OrderBookStatus.Disconnected; - _ = StopAsync(); - }; + _subscription.ConnectionLost += HandleConnectionLost; + _subscription.ConnectionClosed += HandleConnectionClosed; + _subscription.ConnectionRestored += HandleConnectionRestored; - _subscription.ConnectionRestored += async time => await ResyncAsync().ConfigureAwait(false); Status = OrderBookStatus.Synced; return new CallResult(true); } + private void HandleConnectionLost() { + log.Write(LogLevel.Warning, $"{Id} order book {Symbol} connection lost"); + if (Status != OrderBookStatus.Disposed) { + Status = OrderBookStatus.Reconnecting; + Reset(); + } + } + + private void HandleConnectionClosed() { + log.Write(LogLevel.Warning, $"{Id} order book {Symbol} disconnected"); + Status = OrderBookStatus.Disconnected; + _ = StopAsync(); + } + + private async void HandleConnectionRestored(TimeSpan _) { + await ResyncAsync().ConfigureAwait(false); + } + /// public async Task StopAsync() { @@ -286,8 +294,12 @@ namespace CryptoExchange.Net.OrderBook if (_processTask != null) await _processTask.ConfigureAwait(false); - if (_subscription != null) + if (_subscription != null) { await _subscription.CloseAsync().ConfigureAwait(false); + _subscription.ConnectionLost -= HandleConnectionLost; + _subscription.ConnectionClosed -= HandleConnectionClosed; + _subscription.ConnectionRestored -= HandleConnectionRestored; + } log.Write(LogLevel.Trace, $"{Id} order book {Symbol} stopped"); } @@ -601,13 +613,13 @@ namespace CryptoExchange.Net.OrderBook private async Task ProcessQueue() { - while (Status != OrderBookStatus.Disconnected) + while (Status != OrderBookStatus.Disconnected && Status != OrderBookStatus.Disposed) { await _queueEvent.WaitAsync().ConfigureAwait(false); while (_processQueue.TryDequeue(out var item)) { - if (Status == OrderBookStatus.Disconnected) + if (Status == OrderBookStatus.Disconnected || Status == OrderBookStatus.Disposed) break; if (_stopProcessing)