public async Task PerformOperations(
            IReadOnlyList <ICreateJob <TEntityId, TEntityVersion, TEntity> > createJobs,
            IReadOnlyList <IUpdateJob <TEntityId, TEntityVersion, TEntity> > updateJobs,
            IReadOnlyList <IDeleteJob <TEntityId, TEntityVersion> > deleteJobs,
            IProgressLogger progressLogger,
            TContext context)
        {
            foreach (var job in createJobs)
            {
                try
                {
                    var result = await _inner.Create(job.InitializeEntity, context);

                    job.NotifyOperationSuceeded(result);
                }
                catch (Exception x)
                {
                    if (_exceptionHandlingStrategy.DoesGracefullyAbortSynchronization(x))
                    {
                        throw;
                    }
                    else
                    {
                        job.NotifyOperationFailed(x);
                    }
                }
                progressLogger.Increase();
            }

            foreach (var job in updateJobs)
            {
                try
                {
                    var result = await _inner.TryUpdate(job.EntityId, job.Version, job.EntityToUpdate, job.UpdateEntity, context);

                    if (result != null)
                    {
                        job.NotifyOperationSuceeded(result);
                    }
                    else
                    {
                        job.NotifyEntityNotFound();
                    }
                }
                catch (Exception x)
                {
                    if (_exceptionHandlingStrategy.DoesGracefullyAbortSynchronization(x))
                    {
                        throw;
                    }
                    else
                    {
                        job.NotifyOperationFailed(x);
                    }
                }
                progressLogger.Increase();
            }

            foreach (var job in deleteJobs)
            {
                try
                {
                    if (await _inner.TryDelete(job.EntityId, job.Version, context))
                    {
                        job.NotifyOperationSuceeded();
                    }
                    else
                    {
                        job.NotifyEntityNotFound();
                    }
                }
                catch (Exception x)
                {
                    if (_exceptionHandlingStrategy.DoesGracefullyAbortSynchronization(x))
                    {
                        throw;
                    }
                    else
                    {
                        job.NotifyOperationFailed(x);
                    }
                }
                progressLogger.Increase();
            }
        }