public void Write(BoundedBlockingQueue <IndexedBuffer> source, Stream target) { logger.Debug("Writing started"); var currentIndex = 0; foreach (var buffer in source.Consume()) { var bufferIndex = buffer.Index; if (currentIndex == bufferIndex) { WriteInternal(buffer, target); currentIndex++; continue; } if (bufferIndex > currentIndex) { source.Add(buffer); } } }
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(); }