Пример #1
0
            public Logic(Throttle <T> stage) : base(stage.Shape)
            {
                _stage       = stage;
                _tokenBucket = new TickTimeTokenBucket(stage._maximumBurst, stage._ticksBetweenTokens);
                _enforcing   = stage._mode == ThrottleMode.Enforcing;

                SetHandler(_stage.Inlet, this);
                SetHandler(_stage.Outlet, this);
            }
Пример #2
0
            public Logic(Throttle <T> stage) : base(stage.Shape)
            {
                _stage       = stage;
                _tokenBucket = new TickTimeTokenBucket(stage._maximumBurst, stage._ticksBetweenTokens);
                _enforcing   = stage._mode == ThrottleMode.Enforcing;

                SetHandler(_stage.Inlet,
                           onPush: () =>
                {
                    var element    = Grab(stage.Inlet);
                    var cost       = stage._costCalculation(element);
                    var delayTicks = _tokenBucket.Offer(cost);

                    if (delayTicks == 0)
                    {
                        Push(stage.Outlet, element);
                    }
                    else
                    {
                        if (_enforcing)
                        {
                            throw new OverflowException("Maximum throttle throughput exceeded.");
                        }

                        _currentElement = element;
                        ScheduleOnce(TimerName, TimeSpan.FromTicks(delayTicks));
                    }
                },
                           onUpstreamFinish: () =>
                {
                    if (IsAvailable(_stage.Outlet) && IsTimerActive(TimerName))
                    {
                        _willStop = true;
                    }
                    else
                    {
                        CompleteStage();
                    }
                });

                SetHandler(_stage.Outlet, onPull: () => Pull(_stage.Inlet));
            }