/// <summary> /// Perform file compression or decompression action /// </summary> /// <param name="actionType">Action name. Possible values: compress, decompress</param> /// <param name="workersCount">Number of threads</param> /// <param name="chunkSize">Chunk size in bytes</param> /// <param name="errors">Exceptions</param> /// <returns>Operation result</returns> public bool Execute(string actionType, int workersCount, int chunkSize, out List <Exception> errors) { ChunksInfo chunkInfos = _fileSplitterFactory.Create(actionType).GetChunks(_inFile, chunkSize); using (IWriterTask fileWriterTask = _taskFactory.CreatWriterTask(chunkInfos.ChunksCount, _chunkWriter, _errorLogs)) using (IChunksReader chunksReader = _taskFactory.CreateChunksReader(workersCount, _sourceReader, _compressorFactory.Create(actionType), fileWriterTask, _errorLogs)) { foreach (ChunkReadInfo chunkInfo in chunkInfos.Chunks) { chunksReader.EnqueueChunk(new ChunkReadInfo(chunkInfo.Id, chunkInfo.Offset, chunkInfo.BytesCount)); } while (true) { if (!_errorLogs.IsErrorExist(out List <Exception> exceptions)) { if (!IsActiveOp(chunksReader, fileWriterTask)) { return(!_errorLogs.IsErrorExist(out errors)); } continue; } errors = exceptions; return(false); } } }
public ChunksReader(int workersCount, ISourceReader reader, IGZipCompressor compressor, IWriterTask writerTask, IErrorLogs errorLogs) { _compressor = compressor; _fileReader = reader; _writerTask = writerTask; _errorLogs = errorLogs; _threads = new List <Thread>(); for (int i = 0; i < workersCount; ++i) { Thread thread = new Thread(Consume) { IsBackground = true, Name = $"Background worker (chunks queue): {i}" }; _threads.Add(thread); thread.Start(); } }
/// <summary> /// Is operation active /// </summary> /// <returns>Result of checking</returns> public bool IsActiveOp(IChunksReader chunksReader, IWriterTask writerTask) { return(chunksReader.IsActive() || writerTask.IsActive()); }
public void FactoryWillCreateFileWriterTaskObj() { IWriterTask writerTask = _taskFactory.CreatWriterTask(It.IsAny <int>(), It.IsAny <IChunkWriter>(), It.IsAny <IErrorLogs>()); Assert.IsInstanceOf <FileWriterTask>(writerTask); }
/// <summary> /// Create queue for processing chunks from the source /// </summary> /// <param name="workersCount">Thread count in queue</param> /// <param name="reader">Reader from source</param> /// <param name="compressor">Interface for compression, decompression</param> /// <param name="writerTask">Task for write data</param> /// <param name="errorLogs">Execution error logs</param> /// <returns>Chunks queue</returns> public IChunksReader CreateChunksReader(int workersCount, ISourceReader reader, IGZipCompressor compressor, IWriterTask writerTask, IErrorLogs errorLogs) { return(new ChunksReader(workersCount, reader, compressor, writerTask, errorLogs)); }