public BaseArchiver(string inputFilePath, string outputFilePath) { InputFilePath = inputFilePath; OutputFilePath = outputFilePath; InputQueue = new ReaderConsumer(); OutputDictionary = new WriterConsumer(); }
/// <summary> /// Запуск в работу всех блоков. /// </summary> public void Run(Settings settings) { // Хранилище готовых (сжатых) для записи в файл данных. var compressedDataStorage = new CompressedDataStorage(_writeTaskQueue); // Блок обработки (компресии/декомпрессии) исходных данных. var compressConsumers = new ConsumerProvider <DataPortion>(); for (var i = 0; i < ThreadCount; i++) { var compressConsumer = GetConsumer(settings.Mode, _compressingTaskQueue); compressConsumer.RegisterOutputStorage(compressedDataStorage); compressConsumers.Add(compressConsumer); } using (var writer = new Writer(settings.DestinationFilename)) { // Блок сохранения в файл готовых данных var writerConsumer = new WriterConsumer(writer, _writeTaskQueue.Tasks); // Блок чтения исходных данных var blockSizeDefinder = GetBlockSizeDefinder(settings.Mode); var sourceProducer = new SourceDataProducer(_compressingTaskQueue); sourceProducer.Run(settings.SourceFilename, blockSizeDefinder); // Ждём пока блок компресии не закончит работу compressConsumers.WaitTillTaskCompleted(); // Говорим, что от блока компресии в блок сохранения больше заданий не будет _writeTaskQueue.Completed(); // Ждём пока не закончится сохранение в файл writerConsumer.Wait(); } }