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 BufferedReader(IChunkedReader reader, IOBoundQueue ioBoundQueue, Action <OrderedChunk> onRead, SemaphoreSlim readSlotsSemaphore) { _reader = reader; _ioBoundQueue = ioBoundQueue; _onRead = onRead; _readSlotsSemaphore = readSlotsSemaphore; _readChunksDelegate = ReadChunks; }