@@ -58,6 +58,8 @@ public ThrottlingRateLimiter(int maxConcurrentCalls, int? throttlingPercentage =
5858 _concurrencyLimiter = new ConcurrencyLimiter ( limiterOptions ) ;
5959 }
6060
61+ public override TimeSpan ? IdleDuration => null ;
62+
6163 public override RateLimiterStatistics ? GetStatistics ( ) => _concurrencyLimiter . GetStatistics ( ) ;
6264
6365 protected override RateLimitLease AttemptAcquireCore ( int permitCount )
@@ -80,26 +82,24 @@ protected override async ValueTask<RateLimitLease> AcquireAsyncCore(int permitCo
8082
8183 private void ThrottleIfNeeded ( )
8284 {
83- long ? availablePermits = _concurrencyLimiter . GetStatistics ( ) ? . CurrentAvailablePermits ;
84- if ( ! ( availablePermits < _throttlingThreshold ) )
85+ int delay = CalculateDelay ( ) ;
86+ if ( delay > 0 )
8587 {
86- return ;
88+ Thread . Sleep ( delay ) ;
8789 }
88-
89- int delay = ( int ) ( ( 1.0 - availablePermits / ( double ) _maxConcurrency ) * 1000 ) ;
90- Thread . Sleep ( delay ) ;
9190 }
9291
9392 private Task ThrottleIfNeededAsync ( CancellationToken cancellationToken = default )
9493 {
95- long ? availablePermits = _concurrencyLimiter . GetStatistics ( ) ? . CurrentAvailablePermits ;
96- if ( ! ( availablePermits < _throttlingThreshold ) )
94+ int delay = CalculateDelay ( ) ;
95+ if ( delay > 0 )
96+ {
97+ return Task . Delay ( delay , cancellationToken ) ;
98+ }
99+ else
97100 {
98101 return Task . CompletedTask ;
99102 }
100-
101- int delay = ( int ) ( ( 1.0 - availablePermits / ( double ) _maxConcurrency ) * 1000 ) ;
102- return Task . Delay ( delay , cancellationToken ) ;
103103 }
104104
105105 protected override void Dispose ( bool disposing )
@@ -112,6 +112,15 @@ protected override void Dispose(bool disposing)
112112 base . Dispose ( disposing ) ;
113113 }
114114
115- public override TimeSpan ? IdleDuration => null ;
115+ private int CalculateDelay ( )
116+ {
117+ long ? availablePermits = _concurrencyLimiter . GetStatistics ( ) ? . CurrentAvailablePermits ;
118+ if ( ! ( availablePermits < _throttlingThreshold ) )
119+ {
120+ return 0 ;
121+ }
122+
123+ return ( int ) ( ( 1.0 - availablePermits / ( double ) _maxConcurrency ) * 1000 ) ;
124+ }
116125 }
117126}
0 commit comments