private async void BeginWorking()
        {
            IsActive = true;
            while (true)
            {
                FileTransferTask fileTransferTask;
                lock (_fileQueue)
                {
                    if (_fileQueue.Count == 0)
                    {
                        break;
                    }

                    fileTransferTask = _fileQueue.Dequeue();
                }

                if (fileTransferTask.IsCanceled)
                {
                    fileTransferTask.State = FileProcessEntryState.Canceled;
                    continue;
                }

                CurrentTask = fileTransferTask;

                if (fileTransferTask.IsUpload && !fileTransferTask.IsDirectory)
                {
                    await Task.Run(() => UploadEntry(fileTransferTask));
                }
                else if (!fileTransferTask.IsUpload && !fileTransferTask.IsDirectory)
                {
                    await
                    Task.Run(
                        () =>
                        DownloadEntry(fileTransferTask.Path, fileTransferTask.TargetPath, false,
                                      fileTransferTask));
                }
                else if (!fileTransferTask.IsUpload && fileTransferTask.IsDirectory)
                {
                    await
                    Task.Run(
                        () =>
                        DownloadEntry(fileTransferTask.Path, fileTransferTask.TargetPath, true,
                                      fileTransferTask));
                }
            }
            IsActive = false;
            Progress = 1;
            _completedFileTransfers = FileTransferTasks.Select(x => FileTransferTasks.IndexOf(x)).ToList();
        }
        public void DownloadDirectories(IEnumerable <string> directoryPaths, string targetPath)
        {
            lock (_fileQueue)
            {
                foreach (var fileName in directoryPaths)
                {
                    var entry = new FileTransferTask(fileName,
                                                     Path.Combine(targetPath, Path.GetFileName(fileName)), false, true);
                    FileTransferTasks.Add(entry);
                    _fileQueue.Enqueue(entry);
                }

                UpdateProgress();

                if (_isActive)
                {
                    return;
                }

                BeginWorking();
            }
        }
        public void UploadFiles(IEnumerable <string> fileNames, string targetPath)
        {
            lock (_fileQueue)
            {
                foreach (var fileName in fileNames)
                {
                    var entry = new FileTransferTask(fileName,
                                                     Path.Combine(targetPath, Path.GetFileName(fileName)), true, false);
                    FileTransferTasks.Add(entry);
                    _fileQueue.Enqueue(entry);
                    BeginFileUpload?.Invoke(this, entry);
                }

                UpdateProgress();

                if (_isActive)
                {
                    return;
                }

                BeginWorking();
            }
        }