示例#1
0
        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);
                });
            }));
        }
示例#2
0
        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;
                        }
                    });
                }
            }));
        }