CircuitBreakerManualControl
Allows manual control of the circuit-breaker.
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
namespace Polly.CircuitBreaker
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public sealed class CircuitBreakerManualControl
{
[System.Runtime.CompilerServices.Nullable(0)]
private sealed class RegistrationDisposable : IDisposable
{
private readonly CircuitBreakerManualControl _owner = owner;
private readonly Func<ResilienceContext, Task> _onIsolate = onIsolate;
private readonly Func<ResilienceContext, Task> _onReset = onReset;
public RegistrationDisposable(CircuitBreakerManualControl owner, Func<ResilienceContext, Task> onIsolate, Func<ResilienceContext, Task> onReset)
{
}
public void Dispose()
{
_owner.Remove(_onIsolate, _onReset);
}
}
private readonly object _lock = new object();
private readonly HashSet<Func<ResilienceContext, Task>> _onIsolate = new HashSet<Func<ResilienceContext, Task>>();
private readonly HashSet<Func<ResilienceContext, Task>> _onReset = new HashSet<Func<ResilienceContext, Task>>();
private bool _isolated;
internal bool IsEmpty => _onIsolate.Count == 0;
public CircuitBreakerManualControl()
{
}
public CircuitBreakerManualControl(bool isIsolated)
{
_isolated = isIsolated;
}
internal IDisposable Initialize(Func<ResilienceContext, Task> onIsolate, Func<ResilienceContext, Task> onReset)
{
bool isolated = default(bool);
lock (_lock) {
_onIsolate.Add(onIsolate);
_onReset.Add(onReset);
isolated = _isolated;
}
if (isolated) {
ResilienceContext arg = ResilienceContextPool.Shared.Get(default(CancellationToken)).Initialize<VoidResult>(true);
onIsolate(arg).GetAwaiter().GetResult();
}
return new RegistrationDisposable(this, onIsolate, onReset);
}
private void Remove(Func<ResilienceContext, Task> onIsolate, Func<ResilienceContext, Task> onReset)
{
lock (_lock) {
_onIsolate.Remove(onIsolate);
_onReset.Remove(onReset);
}
}
[AsyncStateMachine(typeof(<IsolateAsync>d__10))]
public Task IsolateAsync(CancellationToken cancellationToken = default(CancellationToken))
{
<IsolateAsync>d__10 stateMachine = default(<IsolateAsync>d__10);
stateMachine.<>t__builder = AsyncTaskMethodBuilder.Create();
stateMachine.<>4__this = this;
stateMachine.cancellationToken = cancellationToken;
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.Start(ref stateMachine);
return stateMachine.<>t__builder.Task;
}
[AsyncStateMachine(typeof(<CloseAsync>d__11))]
public Task CloseAsync(CancellationToken cancellationToken = default(CancellationToken))
{
<CloseAsync>d__11 stateMachine = default(<CloseAsync>d__11);
stateMachine.<>t__builder = AsyncTaskMethodBuilder.Create();
stateMachine.<>4__this = this;
stateMachine.cancellationToken = cancellationToken;
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.Start(ref stateMachine);
return stateMachine.<>t__builder.Task;
}
}
}