private void Execute(IChunkedReader reader, IChunkedWriter writer, ManualResetEvent writeCompletedEvent, bool ioIsOnDifferentDrives) { using var readSlotsSemaphore = new SemaphoreSlim(ApplicationConstants.BufferSlots); var writerQueue = new IOBoundQueue(); var readerQueue = ioIsOnDifferentDrives ? new IOBoundQueue() : writerQueue; var chunkProcessor = new GzipChunkProcessor(readSlotsSemaphore, writerQueue, writer, this); void ProcessingFunction(OrderedChunk chunk) => CpuBoundWorkQueue.Instance.QueueWork(() => chunkProcessor.Process(chunk)); var bufferedReader = new BufferedReader(reader, readerQueue, ProcessingFunction, readSlotsSemaphore); var readingFunction = new Function(nameof(BufferedReader.ReadChunks), () => bufferedReader.ReadChunks()); readerQueue.Enqueue(readingFunction); if (ioIsOnDifferentDrives) { new Thread(() => readerQueue.Evaluate()) { IsBackground = true } }
public GzipChunkProcessor(SemaphoreSlim readSlotsSemaphore, IOBoundQueue ioBoundQueue, IChunkedWriter chunkedWriter, IGzipProcessor gzipProcessor) { _readSlotsSemaphore = readSlotsSemaphore; _ioBoundQueue = ioBoundQueue; _chunkedWriter = chunkedWriter; _gzipProcessor = gzipProcessor; }