<PackageReference Include="System.Reactive" Version="6.0.0" />

ContextDisposable

public sealed class ContextDisposable : ICancelable, IDisposable
Represents a disposable resource whose disposal invocation will be posted to the specified SynchronizationContext.
using System.Reactive.Concurrency; using System.Runtime.CompilerServices; using System.Threading; namespace System.Reactive.Disposables { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] public sealed class ContextDisposable : ICancelable, IDisposable { private volatile IDisposable _disposable; public SynchronizationContext Context { get; } public bool IsDisposed => _disposable == BooleanDisposable.True; public ContextDisposable(SynchronizationContext context, IDisposable disposable) { if (context == null) throw new ArgumentNullException("context"); Context = context; if (disposable == null) throw new ArgumentNullException("disposable"); _disposable = disposable; } public void Dispose() { IDisposable disposable = Interlocked.Exchange(ref _disposable, BooleanDisposable.True); if (disposable != BooleanDisposable.True) Context.PostWithStartComplete(delegate(IDisposable d) { d.Dispose(); }, disposable); } } }