async Task Run(CancellationToken cancelToken, IUpdatingSubject <T> subject)
        {
            subject.SubjectChanged += (obj, evt) => _scheduler.RunNow();
            subject.StartWatching();

            var cancelTask = TaskFromCancellationToken(cancelToken);

            while (!cancelTask.IsCanceled)
            {
                var subjects = Enumerable.Empty <T>();
                try
                {
                    subjects = subject.GetSubjects();
                }
                catch (Exception ex)
                {
                    Log.Info("Error when looking for files to delete", ex);
                    _scheduler.RunAfterBackoff();
                }

                foreach (var x in subjects)
                {
                    try
                    {
                        _delete(x);
                        Log.Info($"Deleted the file '{x}'");
                    }
                    catch (AccessDeniedException)
                    {
                        Log.Warn($"Access denied when deleting the file '{x}'");
                    }
                    catch (Exception ex)
                    {
                        Log.Warn($"Error when deleting the file '{x}'", ex);
                        _scheduler.RunAfterBackoff();
                    }
                }

                await Task.WhenAny(_scheduler.WaitForWork(), cancelTask);
            }
        }