private Thread StartGzipProcess(IGZipProcess gzipProcess, ThreadCancelationToken token) { Thread gzipThread = new Thread(param => { var cancelToken = param as ThreadCancelationToken; var partCollection = FilePartCollection.GetInstance(); var partSequince = FilePartSequince.GetInstance(); foreach (var partInfo in partCollection.GetFilePart()) { if (cancelToken.IsCancel) { break; } try { using (var partFileStream = new MemoryStream(partInfo.content)) { var gzipPath = gzipProcess.Process(partInfo.partNumber, partFileStream); partSequince.AppendPartInfo(partInfo.partNumber, gzipPath); } } catch (Exception e) { cancelToken.Cancel(e); } } }); gzipThread.Start(token); return(gzipThread); }
/// <summary> /// Режем входящий файл. /// </summary> /// <param name="fileSlicer">Резак...</param> private void SliseFile(FileSliser fileSlicer, ThreadCancelationToken token) { int partNumber = 0; var partCollection = FilePartCollection.GetInstance(); try { foreach (var partFilePath in fileSlicer.SliseFile()) { if (token.IsCancel) { break; } partCollection.AppendPartInfo(partNumber++, partFilePath); } // эта конструкция должна находиться здесь, для того что бы все остальные потоки прочухали // что что-то не так и откатили изменения. partCollection.End(); } catch (Exception e) { token.Cancel(e); } }
public void Merge(string outputhPath, ThreadCancelationToken token) { var filePartSequince = FilePartSequince.GetInstance(); var outputFile = OutputFileInfo.GetInstance(outputhPath); using (outputFile) { foreach (var filePartPath in filePartSequince.GetFilePart()) { if (token.IsCancel) { outputFile.Delete(); break; } try { outputFile.AppendPart(filePartPath); } catch (Exception e) { outputFile.Delete(); token.Cancel(e); } } if (token.IsCancel) { outputFile.Delete(); } } }
private static void RegisterCompressCommand(ThreadCancelationToken cancelToken, CommandLineApplication commandLineApplication) { commandLineApplication.Command("compress", (target) => { target.HelpOption("-? | -h | --help"); CommandArgument inputName = target.Argument( "filePath", "Введите пути к файлу который необходимо обработать.", multipleValues: false); CommandArgument outputName = target.Argument( "archiveName", "Путь выходного архива.", multipleValues: false); target.OnExecute(() => { try { new CompressCommandHandler().Handle(new CompressCommand(inputName.Value, outputName.Value), cancelToken); } catch (Exception e) { Console.WriteLine("Что-то пошло не так...."); Console.WriteLine(e); } return(0); }); }, false); }
public void Handle(DecompressCommand command, ThreadCancelationToken token) { var fileSliser = new FileSliserBuilder(command.InputFileInfo.FullName) .UseGZIPCompressStrategy() .Build(); var gzipProcess = new DecompressProcess(); base.HandleBase(command, fileSliser, gzipProcess, token); }
public void Handle(CompressCommand command, ThreadCancelationToken token) { var fileSliser = new FileSliserBuilder(command.InputFileInfo.FullName) .UseFixedSizeStrategy(command.PartSizeMB) .Build(); var gzipProcess = new CompressProcess(); base.HandleBase(command, fileSliser, gzipProcess, token); }
private static ThreadCancelationToken GetToken() { var cancelToken = new ThreadCancelationToken(); cancelToken.OnCancel += (e) => { Console.WriteLine("Что-то пошло не так..."); Console.WriteLine(e); }; return(cancelToken); }
/// <summary> /// Запускает поток который собирает все порции в один файл. /// </summary> /// <param name="outFilePath">путь в выходной файл</param> /// <returns></returns> private Thread StartMergeThread(string outFilePath, ThreadCancelationToken tokent) { Thread mergePartition = new Thread(param => { (string filePath, ThreadCancelationToken cancelToken)? castParam = param as (string filePath, ThreadCancelationToken cancelToken)?; new PartitionMerge().Merge(castParam.Value.filePath, castParam.Value.cancelToken); }); var threadParam = (filePath : outFilePath, cancelToken : tokent); mergePartition.Start(threadParam); return(mergePartition); }
protected void HandleBase(IGZipCommand command, FileSliser fileSlicer, IGZipProcess gzipProcess, ThreadCancelationToken token) { var mergePartition = StartMergeThread(command.OutputFileInfo.FullName, token); List <Thread> threadPool = new List <Thread>(5); for (var i = 0; i < 6; i++) { threadPool.Add(StartGzipProcess(gzipProcess, token)); } SliseFile(fileSlicer, token); var partSequince = FilePartSequince.GetInstance(); foreach (var gzipThread in threadPool) { gzipThread.Join(); } partSequince.End(); mergePartition.Join(); }