public IObservable <IChangeSet <T> > Run() { return(Observable.Create <IChangeSet <T> >(observer => { Interlocked.Increment(ref _refCount); if (Volatile.Read(ref _refCount) == 1) { Interlocked.Exchange(ref _list, _source.AsObservableList()); } // ReSharper disable once PossibleNullReferenceException (never the case!) var subscriber = _list.Connect().SubscribeSafe(observer); return Disposable.Create(() => { Interlocked.Decrement(ref _refCount); subscriber.Dispose(); if (Volatile.Read(ref _refCount) != 0) { return; } _list.Dispose(); Interlocked.Exchange(ref _list, null); }); })); }
public IObservable <IChangeSet <T> > Run() { int refCount = 0; var locker = new object(); IObservableList <T> list = null; return(Observable.Create <IChangeSet <T> >(observer => { lock (locker) { refCount++; if (refCount == 1) { list = _source.AsObservableList(); } // ReSharper disable once PossibleNullReferenceException (never the case!) var subscriber = list.Connect().SubscribeSafe(observer); return Disposable.Create(() => { lock (locker) { refCount--; subscriber.Dispose(); if (refCount != 0) { return; } list.Dispose(); list = null; } }); } })); }