From dc4abc42a7ccb79390fd9238c4ad7acb72d7d71b Mon Sep 17 00:00:00 2001 From: JKorf Date: Sat, 17 Jan 2026 16:26:25 +0100 Subject: [PATCH] Added WaitUntilFirstUpdateBufferedAsync method on SymbolOrderBook, fixed sequencen validation bug SymbolOrderBook --- .../OrderBook/SymbolOrderBook.cs | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs b/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs index 3106381..8ef7ccb 100644 --- a/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs +++ b/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs @@ -640,6 +640,34 @@ namespace CryptoExchange.Net.OrderBook return new CallResult(true); } + /// + /// Wait until an update has been buffered + /// + /// Max wait time + /// Cancellation token + /// + protected async Task> WaitUntilFirstUpdateBufferedAsync(TimeSpan timeout, CancellationToken ct) + { + var startWait = DateTime.UtcNow; + while (_processBuffer.Count == 0) + { + if (ct.IsCancellationRequested) + return new CallResult(new CancellationRequestedError()); + + if (DateTime.UtcNow - startWait > timeout) + return new CallResult(new ServerError(new ErrorInfo(ErrorType.OrderBookTimeout, "Timeout while waiting for data"))); + + try + { + await Task.Delay(20, ct).ConfigureAwait(false); + } + catch (OperationCanceledException) + { } + } + + return new CallResult(true); + } + /// /// IDisposable implementation for the order book /// @@ -1002,7 +1030,8 @@ namespace CryptoExchange.Net.OrderBook private SequenceNumberResult ValidateLiveSequenceNumber(long sequenceNumber) { - if (sequenceNumber < LastSequenceNumber) + if (sequenceNumber < LastSequenceNumber + && (_firstUpdateAfterSnapshotDone || !_skipSequenceCheckFirstUpdateAfterSnapshotSet)) // Update is somehow from before the current state return SequenceNumberResult.OutOfSync;