コード例 #1
0
ファイル: Sources.cs プロジェクト: xyicheng/akka.net
            public Logic(QueueSource <TOut> stage, TaskCompletionSource <object> completion) : base(stage.Shape)
            {
                _completion = completion;
                _stage      = stage;

                SetHandler(stage.Out, this);
            }
コード例 #2
0
            public Logic(QueueSource <TOut> source) : base(source.Shape)
            {
                _source = source;

                SetHandler(source.Shape.Outlet,
                           onDownstreamFinish: () =>
                {
                    if (_pendingOffer != null)
                    {
                        var promise = _pendingOffer.Item2;
                        promise.SetResult(QueueOfferResult.QueueClosed.Instance);
                        _pendingOffer = null;
                    }
                    _source._completion.SetResult(new object());
                    CompleteStage();
                },
                           onPull: () =>
                {
                    if (_source._maxBuffer == 0)
                    {
                        if (_pendingOffer != null)
                        {
                            var element = _pendingOffer.Item1;
                            var promise = _pendingOffer.Item2;
                            Push(source.Shape.Outlet, element);
                            promise.SetResult(QueueOfferResult.Enqueued.Instance);
                            _pendingOffer = null;
                        }
                        else
                        {
                            _pulled = true;
                        }
                    }
                    else if (!_buffer.IsEmpty)
                    {
                        Push(source.Shape.Outlet, _buffer.Dequeue());
                        if (_pendingOffer != null)
                        {
                            var element = _pendingOffer.Item1;
                            var promise = _pendingOffer.Item2;
                            EnqueueAndSuccess(element, promise);
                        }
                    }
                    else
                    {
                        _pulled = true;
                    }
                });
            }
コード例 #3
0
ファイル: Sources.cs プロジェクト: yfer/akka.net
            public Logic(QueueSource <TOut> source, TaskCompletionSource <object> completion) : base(source.Shape)
            {
                _completion = completion;
                _source     = source;

                SetHandler(source.Out,
                           onDownstreamFinish: () =>
                {
                    if (_pendingOffer != null)
                    {
                        _pendingOffer.CompletionSource.SetResult(QueueOfferResult.QueueClosed.Instance);
                        _pendingOffer = null;
                    }
                    _completion.SetResult(new object());
                    CompleteStage();
                },
                           onPull: () =>
                {
                    if (_source._maxBuffer == 0)
                    {
                        if (_pendingOffer != null)
                        {
                            Push(source.Out, _pendingOffer.Element);
                            _pendingOffer.CompletionSource.SetResult(QueueOfferResult.Enqueued.Instance);
                            _pendingOffer = null;
                            if (_terminating)
                            {
                                _completion.SetResult(new object());
                                CompleteStage();
                            }
                        }
                    }
                    else if (_buffer.NonEmpty)
                    {
                        Push(source.Out, _buffer.Dequeue());
                        if (_pendingOffer != null)
                        {
                            EnqueueAndSuccess(_pendingOffer);
                            _pendingOffer = null;
                        }
                    }

                    if (_terminating && _buffer.IsEmpty)
                    {
                        _completion.SetResult(new object());
                        CompleteStage();
                    }
                });
            }
コード例 #4
0
 public Materialized(QueueSource <TOut> source, Action <Tuple <TOut, Offered> > invokeLogic)
 {
     _source      = source;
     _invokeLogic = invokeLogic;
 }