private IObservable<Unit> SynchronizeFile(IFileNotification file, IFileSynchronizerVisitor visitor)
 {
     return Observable.FromAsync(async ct => await file.Accept(ct, visitor), _notificationsScheduler)                             
                      .Do(_ =>
                      {
                          _transcodingResultNotifications.OnNext(FileTranscodingResultNotification.CreateSuccess(file));
                          _numberOfFilesAddedInTranscodingQueue.OnNext(-1);
                      })
                      .Catch((Exception ex) =>
                      {
                          _transcodingResultNotifications.OnNext(FileTranscodingResultNotification.CreateFailure(file, ex));
                          _numberOfFilesAddedInTranscodingQueue.OnNext(-1);
                          return Observable.Return(Unit.Default, ImmediateScheduler.Instance);
                      });
 }
		protected override async Task AcceptInternal(CancellationToken ct, IFileSynchronizerVisitor visitor)
		{
			await visitor.Visit(ct, this);
		}
		public Task Accept(CancellationToken ct, IFileSynchronizerVisitor visitor)
		{
			if (visitor == null) throw new ArgumentNullException(nameof(visitor));
			return AcceptInternal(ct, visitor);
		}
		public LoggingFileSynchronizerVisitor(IFileSynchronizerVisitor innerVisitor, ILogger log)
		{
			_innerVisitor = Guard.ForNull(innerVisitor, nameof(innerVisitor));
			_log = Guard.ForNull(log, nameof(log));
		}
		protected abstract Task AcceptInternal(CancellationToken ct, IFileSynchronizerVisitor visitor);