public SynchronizationJob Create(SyncInfo info, CancellationToken cancellationToken)
 {
     try
     {
         return(_inner.Create(info, cancellationToken));
     }
     catch (Exception exception)
     {
         _logger.LogError(exception, "Failed to create job \"{JobName}\".", info?.Name);
         throw;
     }
 }
Exemple #2
0
        public SynchronizationJob Create(SyncInfo info, CancellationToken cancellationToken)
        {
            try
            {
                return(_inner.Create(info, cancellationToken));
            }
#pragma warning disable CA1031 // Do not catch general exception types -- required for robustness
            catch
#pragma warning restore CA1031 // Do not catch general exception types
            {
                var cancel = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
                try
                {
                    return(new SynchronizationJob(Task.Delay(DelayBetweenErrors, cancellationToken), cancel));
                }
                catch
                {
                    cancel.Dispose();
                    throw;
                }
            }
        }
Exemple #3
0
        public async Task Synchronize(CancellationToken cancellationToken)
        {
            HashSet <SyncInfo> infos;

            try
            {
                var task = Task.Delay(997, cancellationToken);
                infos = _infos.ToHashSet();
                await task;
            }
            catch (OperationCanceledException)
            {
                infos = new HashSet <SyncInfo>();
            }

            foreach (var(info, job) in _jobs)
            {
                if (job.Value.IsCompleted)
                {
                    await CompleteJob(info, cancel : false);
                }
                else if (!infos.Contains(info))
                {
                    await CompleteJob(info, cancel : true);
                }
            }

            cancellationToken.ThrowIfCancellationRequested();

            foreach (var info in infos)
            {
                _jobs.GetOrAdd(info, TaskFactory);
            }

            Lazy <SynchronizationJob> TaskFactory(SyncInfo info)
            => new Lazy <SynchronizationJob>(() => _jobFactory.Create(info, cancellationToken));
        }