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