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