コード例 #1
0
 public BaseArchiver(string inputFilePath, string outputFilePath)
 {
     InputFilePath    = inputFilePath;
     OutputFilePath   = outputFilePath;
     InputQueue       = new ReaderConsumer();
     OutputDictionary = new WriterConsumer();
 }
コード例 #2
0
        /// <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();
            }
        }