<PackageReference Include="Relativity.Transfer.Client" Version="7.1.29" />

ScheduledDisposable

using System.Reactive.Concurrency; using System.Threading; namespace System.Reactive.Disposables { public sealed class ScheduledDisposable : ICancelable, IDisposable { private volatile IDisposable _disposable; public IScheduler Scheduler { get; } public IDisposable Disposable { get { IDisposable disposable = _disposable; if (disposable == BooleanDisposable.True) return DefaultDisposable.Instance; return disposable; } } public bool IsDisposed => _disposable == BooleanDisposable.True; public ScheduledDisposable(IScheduler scheduler, IDisposable disposable) { if (scheduler == null) throw new ArgumentNullException("scheduler"); if (disposable == null) throw new ArgumentNullException("disposable"); Scheduler = scheduler; _disposable = disposable; } public void Dispose() { Scheduler.Schedule(DisposeInner); } private void DisposeInner() { IDisposable disposable = Interlocked.Exchange(ref _disposable, BooleanDisposable.True); if (disposable != BooleanDisposable.True) disposable.Dispose(); } } }