@@ -58,6 +58,8 @@ public ThrottlingRateLimiter(int maxConcurrentCalls, int? throttlingPercentage =
58
58
_concurrencyLimiter = new ConcurrencyLimiter ( limiterOptions ) ;
59
59
}
60
60
61
+ public override TimeSpan ? IdleDuration => null ;
62
+
61
63
public override RateLimiterStatistics ? GetStatistics ( ) => _concurrencyLimiter . GetStatistics ( ) ;
62
64
63
65
protected override RateLimitLease AttemptAcquireCore ( int permitCount )
@@ -80,26 +82,24 @@ protected override async ValueTask<RateLimitLease> AcquireAsyncCore(int permitCo
80
82
81
83
private void ThrottleIfNeeded ( )
82
84
{
83
- long ? availablePermits = _concurrencyLimiter . GetStatistics ( ) ? . CurrentAvailablePermits ;
84
- if ( ! ( availablePermits < _throttlingThreshold ) )
85
+ int delay = CalculateDelay ( ) ;
86
+ if ( delay > 0 )
85
87
{
86
- return ;
88
+ Thread . Sleep ( delay ) ;
87
89
}
88
-
89
- int delay = ( int ) ( ( 1.0 - availablePermits / ( double ) _maxConcurrency ) * 1000 ) ;
90
- Thread . Sleep ( delay ) ;
91
90
}
92
91
93
92
private Task ThrottleIfNeededAsync ( CancellationToken cancellationToken = default )
94
93
{
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
97
100
{
98
101
return Task . CompletedTask ;
99
102
}
100
-
101
- int delay = ( int ) ( ( 1.0 - availablePermits / ( double ) _maxConcurrency ) * 1000 ) ;
102
- return Task . Delay ( delay , cancellationToken ) ;
103
103
}
104
104
105
105
protected override void Dispose ( bool disposing )
@@ -112,6 +112,15 @@ protected override void Dispose(bool disposing)
112
112
base . Dispose ( disposing ) ;
113
113
}
114
114
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
+ }
116
125
}
117
126
}
0 commit comments