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); } }