示例#1
0
 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();
        }