ContextDisposable
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);
        }
    }
}