From 5c99da6617a9c89628a5fde27244042122f88b87 Mon Sep 17 00:00:00 2001 From: Jkorf Date: Tue, 22 Feb 2022 12:54:19 +0100 Subject: [PATCH] Dispose handling order book --- .../Clients/BaseSocketClient.cs | 6 ++++ CryptoExchange.Net/Objects/Enums.cs | 10 +++++- .../OrderBook/SymbolOrderBook.cs | 31 +++++++++++++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/CryptoExchange.Net/Clients/BaseSocketClient.cs b/CryptoExchange.Net/Clients/BaseSocketClient.cs index 5b33c1b..7f9b339 100644 --- a/CryptoExchange.Net/Clients/BaseSocketClient.cs +++ b/CryptoExchange.Net/Clients/BaseSocketClient.cs @@ -152,6 +152,9 @@ namespace CryptoExchange.Net /// protected virtual async Task> SubscribeAsync(SocketApiClient apiClient, string url, object? request, string? identifier, bool authenticated, Action> dataHandler, CancellationToken ct) { + if (disposing) + return new CallResult(new InvalidOperationError("Client disposed, can't subscribe")); + SocketConnection socketConnection; SocketSubscription subscription; var released = false; @@ -277,6 +280,9 @@ namespace CryptoExchange.Net /// protected virtual async Task> QueryAsync(SocketApiClient apiClient, string url, object request, bool authenticated) { + if (disposing) + return new CallResult(new InvalidOperationError("Client disposed, can't query")); + SocketConnection socketConnection; var released = false; await semaphoreSlim.WaitAsync().ConfigureAwait(false); diff --git a/CryptoExchange.Net/Objects/Enums.cs b/CryptoExchange.Net/Objects/Enums.cs index 0543015..d01922f 100644 --- a/CryptoExchange.Net/Objects/Enums.cs +++ b/CryptoExchange.Net/Objects/Enums.cs @@ -69,7 +69,15 @@ /// /// Data synced, order book is up to date /// - Synced + Synced, + /// + /// Disposing + /// + Disposing, + /// + /// Disposed + /// + Disposed } /// diff --git a/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs b/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs index a4c95fc..4734cc3 100644 --- a/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs +++ b/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs @@ -506,9 +506,36 @@ namespace CryptoExchange.Net.OrderBook } /// - /// Dispose the order book + /// IDisposable implementation for the order book /// - public abstract void Dispose(); + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Dispose method + /// + /// + protected virtual void Dispose(bool disposing) + { + Status = OrderBookStatus.Disposing; + + _cts?.Cancel(); + _queueEvent.Set(); + + // Clear queue + while (_processQueue.TryDequeue(out _)) { } + + processBuffer.Clear(); + asks.Clear(); + bids.Clear(); + AskCount = 0; + BidCount = 0; + + Status = OrderBookStatus.Disposed; + } /// /// String representation of the top 3 entries