コード例 #1
0
        private async Task <bool> ReadEventsCallbackAsync(StreamEventsSlice slice, long?lastEventNumber)
        {
            bool flag1 = ShouldStop;

            if (!flag1)
            {
                flag1 = await ProcessEventsAsync(lastEventNumber, slice).ConfigureAwait(false);
            }
            bool flag2 = flag1;

            if (flag2 && Verbose)
            {
                Log.Debug("Catch-up Subscription {0} to {1}: finished reading events, nextReadEventNumber = {2}.", (object)SubscriptionName, IsSubscribedToAll ? (object)"<all>" : (object)StreamId, (object)_nextReadEventNumber);
            }
            return(flag2);
        }
コード例 #2
0
        private async Task <bool> ProcessEventsAsync(long?lastEventNumber, StreamEventsSlice slice)
        {
            bool done;

            switch (slice)
            {
            case StreamDeletedSlice _:
                throw new StreamDeletedException(new StreamName(StreamId));

            case StreamNotFoundSlice _:
                if (lastEventNumber == -1)
                {
                    throw new Exception(
                              $"Impossible: stream {StreamId} disappeared in the middle of catching up subscription {SubscriptionName}.");
                }
                done = true;
                break;

            case StreamEventsSlice _:
                RecordedEvent[] resolvedEventArray = slice.Events;
                for (int index = 0; index < resolvedEventArray.Length; ++index)
                {
                    await TryProcessAsync(resolvedEventArray[index]).ConfigureAwait(false);
                }

                _nextReadEventNumber = slice.NextEventNumber;
                if (lastEventNumber.HasValue)
                {
                    done = slice.NextEventNumber > lastEventNumber.Value;
                }
                else
                {
                    done = slice.IsEndOfStream;
                }
                break;

            default:
                throw new ArgumentOutOfRangeException(string.Format($"Subscription {SubscriptionName} unexpected StreamEventsSlice.Status."));
            }

            if (!done && slice.IsEndOfStream)
            {
                Thread.Sleep(1);
            }
            return(done);
        }