Ejemplo n.º 1
0
        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
                }
            }
Ejemplo n.º 2
0
 public GzipChunkProcessor(SemaphoreSlim readSlotsSemaphore,
                           IOBoundQueue ioBoundQueue,
                           IChunkedWriter chunkedWriter,
                           IGzipProcessor gzipProcessor)
 {
     _readSlotsSemaphore = readSlotsSemaphore;
     _ioBoundQueue       = ioBoundQueue;
     _chunkedWriter      = chunkedWriter;
     _gzipProcessor      = gzipProcessor;
 }