AutoDetachObserver<T>
using System.Reactive.Disposables;
namespace System.Reactive
{
internal sealed class AutoDetachObserver<T> : ObserverBase<T>
{
private readonly IObserver<T> _observer;
private readonly SingleAssignmentDisposable _disposable = new SingleAssignmentDisposable();
public IDisposable Disposable {
set {
_disposable.Disposable = value;
}
}
public AutoDetachObserver(IObserver<T> observer)
{
_observer = observer;
}
protected override void OnNextCore(T value)
{
bool flag = false;
try {
_observer.OnNext(value);
flag = true;
} finally {
if (!flag)
Dispose();
}
}
protected override void OnErrorCore(Exception exception)
{
try {
_observer.OnError(exception);
} finally {
Dispose();
}
}
protected override void OnCompletedCore()
{
try {
_observer.OnCompleted();
} finally {
Dispose();
}
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
_disposable.Dispose();
}
}
}