private void Init(CompressionParams @params, CancellationToken cancellationToken) { _params = @params; _readThread = new Thread(() => Wrap <ReadException>(() => ReadInternal(_params.InputPath, cancellationToken))); _readThread.IsBackground = true; _writeThread = new Thread(() => Wrap <WriteException>(() => WriteInternal(_params.OutputPath, cancellationToken))); _writeThread.IsBackground = true; var queueLimit = Environment.ProcessorCount; // set limit for queues _inputQueue = new SafeIndexQueue <byte[]>(queueLimit * 2); _outputQueue = new SafeIndexQueue <byte[]>(queueLimit * 2); var processThreadsCount = GetOptimalThreadsCount(); _countdownEvent = new CountdownEvent(processThreadsCount); _processThreads = new Thread[processThreadsCount]; for (var i = 0; i < processThreadsCount; i++) { _processThreads[i] = new Thread(() => Wrap <ProcessException>(() => ProcessInternal(cancellationToken))); _processThreads[i].IsBackground = true; } }
public void Execute(CompressionParams @params, CancellationToken cancellationToken) { using (var processor = GetProcessor(@params)) { processor.Execute(@params, cancellationToken); } }
private BaseStreamProcessor GetProcessor(CompressionParams @params) { switch (@params.CommandType) { case CommandType.Compress: return(new Compressor()); case CommandType.Decompress: return(new Decompressor()); default: throw new InvalidOperationException("Unknown command type"); } }
public void Execute(CompressionParams @params, CancellationToken cancellationToken) { lock (_lockObj) { CheckDisposed(); Validate(@params); Init(@params, cancellationToken); StartReadInBackground(); StartProcessInBackground(); StartWriteInBackground(); WaitWriteComplete(); } }
public static int Main(string[] args) { if (!CompressionParams.TryParse(args, out var @params)) { Console.WriteLine("Error! Usage: ArchiveTest.exe <compress/decompress> <source path> <destination path>"); return(1); } Console.CancelKeyPress += Handler; try { _gZipService.Execute(@params, _cancellationTokenSource.Token); return(0); } catch (Exception e) { Console.WriteLine(e.Message); return(1); } }
private void Validate(CompressionParams @params) { if (!File.Exists(@params.InputPath)) { throw new FileNotFoundException("Source file should exists"); } if (!File.Exists(@params.OutputPath)) { return; } try { File.Delete(@params.OutputPath); } catch (Exception e) { throw new ValidationException("Destination file exists and couldn't be deleted", e); } }
public void RunProcessManager(CompressionParams settings) { using (var reader = new FileStream(settings.SourceFile, FileMode.Open, FileAccess.Read, FileShare.Read, settings.BlockSize, FileOptions.Asynchronous)) { using (var writer = new FileStream(settings.RecoverFileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write, settings.BlockSize, FileOptions.Asynchronous)) { var readerWriter = readerWriterFactory.GetFileReaderWriter(reader, writer); pool.StartThreadPool(); settings.Mode.Instruction.Processing(pool, readerWriter); long res = 0, old = 0; while (!pool.IsFinished()) { Thread.Sleep(100); if (!pool.QueueExceptionIsEmpty()) { throw pool.GetThreadsException(); } if (old < (res = (100 * reader.Position) / reader.Length)) { Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + " Прогресс: " + (old = res) + "%"); } } settings.Mode.Instruction.PostProcessing(readerWriter); pool.Stop(); } } }
public void Setup() { _params = new CompressionParams(); _sut = CreateSut(); }