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); }
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)); }