Пример #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
                }
            }
Пример #2
0
 public BufferedReader(IChunkedReader reader, IOBoundQueue ioBoundQueue, Action <OrderedChunk> onRead,
                       SemaphoreSlim readSlotsSemaphore)
 {
     _reader             = reader;
     _ioBoundQueue       = ioBoundQueue;
     _onRead             = onRead;
     _readSlotsSemaphore = readSlotsSemaphore;
     _readChunksDelegate = ReadChunks;
 }