SerialDisposable
namespace System.Reactive.Disposables
{
public sealed class SerialDisposable : ICancelable, IDisposable
{
private readonly object _gate = new object();
private IDisposable _current;
private bool _disposed;
public bool IsDisposed {
get {
lock (_gate) {
return _disposed;
}
}
}
public IDisposable Disposable {
get {
return _current;
}
set {
bool flag = false;
IDisposable disposable = null;
lock (_gate) {
flag = _disposed;
if (!flag) {
disposable = _current;
_current = value;
}
}
disposable?.Dispose();
if (flag)
value?.Dispose();
}
}
public void Dispose()
{
IDisposable disposable = null;
lock (_gate) {
if (!_disposed) {
_disposed = true;
disposable = _current;
_current = null;
}
}
disposable?.Dispose();
}
}
}