protected override async Task ProcessEventsAsync(IReadOnlyList <EventData> events) { await BeforeProcessEventsAsync(RetryHandler.ServiceCancellationToken).ConfigureAwait(false); await RetryHandler.HandleAsync(async cancel => { string lastOffset = null; using (var tx = StateManager.CreateTransaction()) { await AfterTransactionOpenAsync(tx, cancel).ConfigureAwait(false); foreach (var @event in events) { await ProcessEventAsync(tx, @event, cancel).ConfigureAwait(false); lastOffset = @event.SystemProperties.Offset; } await _offsets.SetAsync(tx, _partition, lastOffset).ConfigureAwait(false); await BeforeTransactionCommitAsync(tx, cancel).ConfigureAwait(false); await tx.CommitAsync().ConfigureAwait(false); } }, false, TransientExceptionChecker).ConfigureAwait(false); await AfterProcessEventsAsync(RetryHandler.ServiceCancellationToken).ConfigureAwait(false); }