@@ -49,13 +49,10 @@ public override ValueTask<Resource> AcquireAsync(long requestedCount, Cancellati
49
49
Interlocked . Add ( ref _resourceCount , - requestedCount ) ;
50
50
51
51
var registration = new RateLimitRequest ( requestedCount ) ;
52
+ _queue . Enqueue ( registration ) ;
52
53
53
- if ( WaitHandle . WaitAny ( new [ ] { registration . MRE . WaitHandle , cancellationToken . WaitHandle } ) == 0 )
54
- {
55
- return ValueTask . FromResult ( Resource . NoopResource ) ;
56
- }
57
-
58
- throw new InvalidOperationException ( "Limit exceeded" ) ;
54
+ // handle cancellation
55
+ return new ValueTask < Resource > ( registration . TCS . Task ) ;
59
56
}
60
57
61
58
private static void Replenish ( object ? state )
@@ -86,7 +83,7 @@ private static void Replenish(object? state)
86
83
if ( requestToFulfill == request )
87
84
{
88
85
// If requestToFulfill == request, the fulfillment is successful.
89
- requestToFulfill . MRE . Set ( ) ;
86
+ requestToFulfill . TCS . SetResult ( Resource . NoopResource ) ;
90
87
}
91
88
else
92
89
{
@@ -114,12 +111,13 @@ private class RateLimitRequest
114
111
public RateLimitRequest ( long count )
115
112
{
116
113
Count = count ;
117
- MRE = new ManualResetEventSlim ( ) ;
114
+ // Use VoidAsyncOperationWithData<T> instead
115
+ TCS = new TaskCompletionSource < Resource > ( ) ;
118
116
}
119
117
120
118
public long Count { get ; }
121
119
122
- public ManualResetEventSlim MRE { get ; }
120
+ public TaskCompletionSource < Resource > TCS { get ; }
123
121
}
124
122
}
125
123
}
0 commit comments