MultipleAssignmentDisposable
using System.Threading;
namespace System.Reactive.Disposables
{
public sealed class MultipleAssignmentDisposable : ICancelable, IDisposable
{
private IDisposable _current;
public bool IsDisposed => Volatile.Read(ref _current) == BooleanDisposable.True;
public IDisposable Disposable {
get {
IDisposable disposable = Volatile.Read(ref _current);
if (disposable == BooleanDisposable.True)
disposable = DefaultDisposable.Instance;
return disposable;
}
set {
IDisposable disposable2;
for (IDisposable disposable = Volatile.Read(ref _current); disposable != BooleanDisposable.True; disposable = disposable2) {
disposable2 = Interlocked.CompareExchange(ref _current, value, disposable);
if (disposable == disposable2)
return;
}
value?.Dispose();
}
}
public void Dispose()
{
IDisposable disposable = Volatile.Read(ref _current);
if (disposable != BooleanDisposable.True) {
disposable = Interlocked.Exchange(ref _current, BooleanDisposable.True);
if (disposable != BooleanDisposable.True)
disposable?.Dispose();
}
}
}
}