ComponentDisposeHelper
using System;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
namespace Polly.Utils.Pipeline
{
internal sealed class ComponentDisposeHelper : IAsyncDisposable
{
[System.Runtime.CompilerServices.Nullable(1)]
private readonly PipelineComponent _component;
private readonly DisposeBehavior _disposeBehavior;
private bool _disposed;
[System.Runtime.CompilerServices.NullableContext(1)]
public ComponentDisposeHelper(PipelineComponent component, DisposeBehavior disposeBehavior)
{
_component = component;
_disposeBehavior = disposeBehavior;
}
public ValueTask DisposeAsync()
{
if (EnsureDisposable())
return ForceDisposeAsync();
return default(ValueTask);
}
public void EnsureNotDisposed()
{
if (_disposed)
throw new ObjectDisposedException("ResiliencePipeline", "This resilience pipeline has been disposed and cannot be used anymore.");
}
public ValueTask ForceDisposeAsync()
{
_disposed = true;
return _component.DisposeAsync();
}
private bool EnsureDisposable()
{
if (_disposeBehavior == DisposeBehavior.Ignore)
return false;
if (_disposeBehavior == DisposeBehavior.Reject)
throw new InvalidOperationException("Disposing this resilience pipeline is not allowed because it is owned by the pipeline registry.");
return !_disposed;
}
}
}