public void Copy(Stream source, Stream target) { using (var readQueue = new BoundedBlockingQueue <byte[]>(100)) { scheduler.StartNew(() => { reader.Read(source, readQueue); readQueue.CompleteAdding(); }); using (var processedQueue = new BoundedBlockingQueue <IndexedBuffer>(100)) { scheduler.StartNew(() => { processor.Process(readQueue, processedQueue); processedQueue.CompleteAdding(); }); var writeWaitHandle = new ManualResetEvent(false); scheduler.StartNew(() => writer.Write(processedQueue, target), writeWaitHandle); writeWaitHandle.WaitOne(); } } }
public void Process(BoundedBlockingQueue <byte[]> source, BoundedBlockingQueue <IndexedBuffer> target) { Logger.Debug("Processing started"); var bufferFactory = new IndexedBufferFactory(); var waitHandlesHelper = new EventWaitHandlesHelper(); foreach (var buffer in source.Consume()) { var waitHandle = source.AddingCompleted ? waitHandlesHelper.GetNew() : null; var indexedBuffer = bufferFactory.GetNext(); scheduler.StartNew(() => { indexedBuffer.Data = ProcessInternal(buffer); target.Add(indexedBuffer); Logger.Debug($"Processed {indexedBuffer.Index}"); }, waitHandle); } Logger.Debug("Consuming finished"); waitHandlesHelper.WaitAll(); target.CompleteAdding(); }