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