Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }