@@ -5,12 +5,12 @@ namespace Polly.CircuitBreaker;
5
5
/// <summary>
6
6
/// Thread-safe controller that holds and manages the circuit breaker state transitions.
7
7
/// </summary>
8
- internal sealed class CircuitStateController : IDisposable
8
+ internal sealed class CircuitStateController < T > : IDisposable
9
9
{
10
10
private readonly object _lock = new ( ) ;
11
11
private readonly ScheduledTaskExecutor _executor = new ( ) ;
12
- private readonly EventInvoker < OnCircuitOpenedArguments > ? _onOpened ;
13
- private readonly EventInvoker < OnCircuitClosedArguments > ? _onClosed ;
12
+ private readonly Func < OutcomeArguments < T , OnCircuitOpenedArguments > , ValueTask > ? _onOpened ;
13
+ private readonly Func < OutcomeArguments < T , OnCircuitClosedArguments > , ValueTask > ? _onClosed ;
14
14
private readonly Func < OnCircuitHalfOpenedArguments , ValueTask > ? _onHalfOpen ;
15
15
private readonly TimeProvider _timeProvider ;
16
16
private readonly ResilienceStrategyTelemetry _telemetry ;
@@ -24,8 +24,8 @@ internal sealed class CircuitStateController : IDisposable
24
24
25
25
public CircuitStateController (
26
26
TimeSpan breakDuration ,
27
- EventInvoker < OnCircuitOpenedArguments > ? onOpened ,
28
- EventInvoker < OnCircuitClosedArguments > ? onClosed ,
27
+ Func < OutcomeArguments < T , OnCircuitOpenedArguments > , ValueTask > ? onOpened ,
28
+ Func < OutcomeArguments < T , OnCircuitClosedArguments > , ValueTask > ? onClosed ,
29
29
Func < OnCircuitHalfOpenedArguments , ValueTask > ? onHalfOpen ,
30
30
CircuitBehavior behavior ,
31
31
TimeProvider timeProvider ,
@@ -90,7 +90,7 @@ public ValueTask IsolateCircuitAsync(ResilienceContext context)
90
90
lock ( _lock )
91
91
{
92
92
SetLastHandledOutcome_NeedsLock ( new Outcome < VoidResult > ( new IsolatedCircuitException ( ) ) ) ;
93
- OpenCircuitFor_NeedsLock ( new Outcome < VoidResult > ( VoidResult . Instance ) , TimeSpan . MaxValue , manual : true , context , out task ) ;
93
+ OpenCircuitFor_NeedsLock ( new Outcome < T > ( default ( T ) ) , TimeSpan . MaxValue , manual : true , context , out task ) ;
94
94
_circuitState = CircuitState . Isolated ;
95
95
}
96
96
@@ -107,13 +107,13 @@ public ValueTask CloseCircuitAsync(ResilienceContext context)
107
107
108
108
lock ( _lock )
109
109
{
110
- CloseCircuit_NeedsLock ( new Outcome < VoidResult > ( VoidResult . Instance ) , manual : true , context , out task ) ;
110
+ CloseCircuit_NeedsLock ( new Outcome < T > ( default ( T ) ) , manual : true , context , out task ) ;
111
111
}
112
112
113
113
return ExecuteScheduledTaskAsync ( task , context ) ;
114
114
}
115
115
116
- public async ValueTask < Outcome < TResult > ? > OnActionPreExecuteAsync < TResult > ( ResilienceContext context )
116
+ public async ValueTask < Outcome < T > ? > OnActionPreExecuteAsync ( ResilienceContext context )
117
117
{
118
118
EnsureNotDisposed ( ) ;
119
119
@@ -150,13 +150,13 @@ public ValueTask CloseCircuitAsync(ResilienceContext context)
150
150
151
151
if ( exception is not null )
152
152
{
153
- return new Outcome < TResult > ( exception ) ;
153
+ return new Outcome < T > ( exception ) ;
154
154
}
155
155
156
156
return null ;
157
157
}
158
158
159
- public ValueTask OnActionSuccessAsync < TResult > ( Outcome < TResult > outcome , ResilienceContext context )
159
+ public ValueTask OnActionSuccessAsync ( Outcome < T > outcome , ResilienceContext context )
160
160
{
161
161
EnsureNotDisposed ( ) ;
162
162
@@ -182,7 +182,7 @@ public ValueTask OnActionSuccessAsync<TResult>(Outcome<TResult> outcome, Resilie
182
182
return ExecuteScheduledTaskAsync ( task , context ) ;
183
183
}
184
184
185
- public ValueTask OnActionFailureAsync < TResult > ( Outcome < TResult > outcome , ResilienceContext context )
185
+ public ValueTask OnActionFailureAsync ( Outcome < T > outcome , ResilienceContext context )
186
186
{
187
187
EnsureNotDisposed ( ) ;
188
188
@@ -251,11 +251,11 @@ private void EnsureNotDisposed()
251
251
{
252
252
if ( _disposed )
253
253
{
254
- throw new ObjectDisposedException ( nameof ( CircuitStateController ) ) ;
254
+ throw new ObjectDisposedException ( nameof ( CircuitStateController < T > ) ) ;
255
255
}
256
256
}
257
257
258
- private void CloseCircuit_NeedsLock < TResult > ( Outcome < TResult > outcome , bool manual , ResilienceContext context , out Task ? scheduledTask )
258
+ private void CloseCircuit_NeedsLock ( Outcome < T > outcome , bool manual , ResilienceContext context , out Task ? scheduledTask )
259
259
{
260
260
scheduledTask = null ;
261
261
@@ -269,12 +269,12 @@ private void CloseCircuit_NeedsLock<TResult>(Outcome<TResult> outcome, bool manu
269
269
270
270
if ( priorState != CircuitState . Closed )
271
271
{
272
- var args = new OutcomeArguments < TResult , OnCircuitClosedArguments > ( context , outcome , new OnCircuitClosedArguments ( manual ) ) ;
272
+ var args = new OutcomeArguments < T , OnCircuitClosedArguments > ( context , outcome , new OnCircuitClosedArguments ( manual ) ) ;
273
273
_telemetry . Report ( CircuitBreakerConstants . OnCircuitClosed , args ) ;
274
274
275
275
if ( _onClosed is not null )
276
276
{
277
- _executor . ScheduleTask ( ( ) => _onClosed . HandleAsync ( args ) . AsTask ( ) , context , out scheduledTask ) ;
277
+ _executor . ScheduleTask ( ( ) => _onClosed ( args ) . AsTask ( ) , context , out scheduledTask ) ;
278
278
}
279
279
}
280
280
}
@@ -310,12 +310,12 @@ private void SetLastHandledOutcome_NeedsLock<TResult>(Outcome<TResult> outcome)
310
310
311
311
private BrokenCircuitException GetBreakingException_NeedsLock ( ) => _breakingException ?? new BrokenCircuitException ( ) ;
312
312
313
- private void OpenCircuit_NeedsLock < TResult > ( Outcome < TResult > outcome , bool manual , ResilienceContext context , out Task ? scheduledTask )
313
+ private void OpenCircuit_NeedsLock ( Outcome < T > outcome , bool manual , ResilienceContext context , out Task ? scheduledTask )
314
314
{
315
315
OpenCircuitFor_NeedsLock ( outcome , _breakDuration , manual , context , out scheduledTask ) ;
316
316
}
317
317
318
- private void OpenCircuitFor_NeedsLock < TResult > ( Outcome < TResult > outcome , TimeSpan breakDuration , bool manual , ResilienceContext context , out Task ? scheduledTask )
318
+ private void OpenCircuitFor_NeedsLock ( Outcome < T > outcome , TimeSpan breakDuration , bool manual , ResilienceContext context , out Task ? scheduledTask )
319
319
{
320
320
scheduledTask = null ;
321
321
var utcNow = _timeProvider . UtcNow ;
@@ -325,12 +325,12 @@ private void OpenCircuitFor_NeedsLock<TResult>(Outcome<TResult> outcome, TimeSpa
325
325
var transitionedState = _circuitState ;
326
326
_circuitState = CircuitState . Open ;
327
327
328
- var args = new OutcomeArguments < TResult , OnCircuitOpenedArguments > ( context , outcome , new OnCircuitOpenedArguments ( breakDuration , manual ) ) ;
328
+ var args = new OutcomeArguments < T , OnCircuitOpenedArguments > ( context , outcome , new OnCircuitOpenedArguments ( breakDuration , manual ) ) ;
329
329
_telemetry . Report ( CircuitBreakerConstants . OnCircuitOpened , args ) ;
330
330
331
331
if ( _onOpened is not null )
332
332
{
333
- _executor . ScheduleTask ( ( ) => _onOpened . HandleAsync ( args ) . AsTask ( ) , context , out scheduledTask ) ;
333
+ _executor . ScheduleTask ( ( ) => _onOpened ( args ) . AsTask ( ) , context , out scheduledTask ) ;
334
334
}
335
335
}
336
336
}
0 commit comments