<PackageReference Include="Nito.Disposables" Version="2.5.0-alpha.1" />

Nito.Disposables.SingleNonblockingAsyncDisposable<T>

A base class for disposables that need exactly-once semantics in a thread-safe way.
namespace Nito.Disposables { public abstract class SingleNonblockingAsyncDisposable<[System.Runtime.CompilerServices.Nullable(2)] T> : IAsyncDisposable { public bool IsDisposed { get; } protected SingleNonblockingAsyncDisposable(T context); protected abstract ValueTask DisposeAsync(T context); public ValueTask DisposeAsync(); protected bool TryUpdateContext(Func<T, T> contextUpdater); } }