示例#1
0
 protected virtual Page <T> AddPage()
 {
     using (_pageHeaders.EnterWriteScope()) {
         Page <T> newPage;
         if (!_pageHeaders.Any())
         {
             newPage = Page <T> .First;
         }
         else
         {
             var lastPage = _pageHeaders.Last();
             newPage = new Page <T>(lastPage.PageNumber + 1, lastPage.EndIndex + 1);
         }
         _pageHeaders.Add(newPage);
         return(newPage);
     }
 }
示例#2
0
        public void Run(Stream input, Stream output)
        {
            if (_blockingStreams == null)
            {
                throw new ObjectDisposedException(GetType().Name);
            }
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }
            if (!input.CanRead)
            {
                throw new ArgumentException("input");
            }
            if (output == null)
            {
                throw new ArgumentNullException("output");
            }
            if (!output.CanWrite)
            {
                throw new ArgumentException("output");
            }

            var         errors    = new SynchronizedList <Exception>();
            ThreadStart lastStage = null;

            for (var i = 0; i < _filters.Length; i++)
            {
                var stageInput  = i == 0 ? input : _blockingStreams[i - 1];
                var stageOutput =
                    i == _filters.Length - 1 ? output : _blockingStreams[i];
                var         filter = _filters[i];
                ThreadStart stage  = delegate {
                    try {
                        filter(stageInput, stageOutput);
                        var blockingStream = stageOutput as BlockingStream;
                        if (blockingStream != null)
                        {
                            blockingStream.SetEndOfStream();
                        }
                    } catch (Exception error) {
                        errors.Add(error);
                        var blockingStream = stageOutput as BlockingStream;
                        if (blockingStream != null)
                        {
                            blockingStream.SetEndOfStreamDueToFailure();
                        }
                    }
                };
                if (i < _filters.Length - 1)
                {
                    var t = new Thread(stage)
                    {
                        IsBackground = true
                    };
                    t.Start();
                }
                else
                {
                    lastStage = stage;
                }
            }
            if (!errors.Any())
            {
                try {
                    lastStage();
                } catch (Exception error) {
                    errors.Add(error);
                }
            }
            if (errors.Any())
            {
                throw new AggregateException(errors);
            }
        }