private Task <Page> RequestPageLoad(string subscriptionId, long precedingCheckpoint, CancellationToken cancellationToken) { var loadRequest = new LoadRequest { SubscriptionId = subscriptionId, PrecedingCheckpoint = precedingCheckpoint, CancellationToken = cancellationToken }; pendingRequests.Enqueue(loadRequest); requestQueued.TrySetResult(true); return(loadRequest.Page); }
internal async Task <Page> GetNextPage(long precedingCheckpoint, string subscriptionId, CancellationToken cancellationToken) { Page pageFromCache = TryGetNextPageFromCache(precedingCheckpoint, subscriptionId, cancellationToken); if (!pageFromCache.IsEmpty) { if (pageFromCache.Transactions.Count < maxPageSize) { Task _ = RequestPageLoad(subscriptionId, pageFromCache.LastCheckpoint, cancellationToken); } return(pageFromCache); } LoadRequest pendingRequest = pendingRequests.ToArray().SingleOrDefault(x => x.PrecedingCheckpoint == precedingCheckpoint); if (pendingRequest != null) { logDebug(() => $"Pending Request Found (subscription: {subscriptionId}, originalSubscription: " + $"{pendingRequest.SubscriptionId}, preceding checkpoint: {precedingCheckpoint}"); return(await pendingRequest.Page); } Page completedPage = await RequestPageLoad(subscriptionId, precedingCheckpoint, cancellationToken); if ((completedPage != null) && ShouldPreloadNextPage(completedPage)) { // Ignore the result. It will become available through the queue. Task _ = RequestPageLoad(subscriptionId, completedPage.LastCheckpoint, cancellationToken); } return(completedPage); }