public void Run(params object[] args)
        {
            if (runner == null)
            {
                runner = new AsyncTaskRunner <R> (retryCount, retryDelay, doInBackground, onWorkCompleted, onError);
            }

            runner.Run(args);
        }
        public void Run(CancellationToken token = default)
        {
            token.ThrowIfCancellationRequested();
            if (!Plan())
            {
                return;
            }
            if (!_filesToBeCleaned.Any())
            {
                Logger.Trace("No files to clean up");
            }
            else
            {
                Logger.Trace("These files are going to be deleted:");
                foreach (var file in _filesToBeCleaned)
                {
                    Logger.Trace(file);
                }

                _taskRunner.Run(token);
                try
                {
                    _taskRunner.Wait();
                }
                catch (Exception)
                {
                }

                BackupManager.Instance.Flush();
                ComponentDownloadPathStorage.Instance.Clear();

                if (!_filesFailedToBeCleaned.Any())
                {
                    return;
                }
                Logger.Trace("These files have not been deleted because of an internal error:");
                foreach (var file in _filesFailedToBeCleaned)
                {
                    Logger.Trace(file);
                }
            }
        }