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