Beispiel #1
0
        public void ExplicitRelease()
        {
            int       onnext      = 0;
            Exception e           = null;
            bool      isCompleted = false;

            var observable = new OnDemandObservable <int>();
            var dispose    = observable.AsWeakObservable().Subscribe(new DelegateObserver <int>(i => onnext += i, ex => e = ex, () => { isCompleted = true; }));

            observable.OnNext(3);
            onnext.Is(3);

            observable.OnError(E);
            e.IsNotNull();

            observable.OnCompleted();
            isCompleted.IsTrue();

            // reset values.
            e           = null;
            isCompleted = false;

            // unsubscribe
            dispose.Dispose();

            observable.OnNext(6);
            onnext.Is(3);    // it should not be notified.

            observable.OnError(E);
            e.IsNull();

            observable.OnCompleted();
            isCompleted.IsFalse();
        }
        public void NoSpecifiedDelegates()
        {
            var testObservable = new OnDemandObservable <int>();
            var observer       = new DelegateObserver <int>();

            testObservable.Subscribe(observer);

            testObservable.OnNext(1);
            testObservable.OnError(new ArgumentException());
            testObservable.OnCompleted();
        }
Beispiel #3
0
        public void ImplicitReleaseByLostObserver()
        {
            int       onnext      = 0;
            Exception e           = null;
            bool      isCompleted = false;

            var         observable = new OnDemandObservable <int>();
            IDisposable disposable = null;
            WeakReference <IObserver <int> > weak = null;

            void exec()
            {
                var o = new DelegateObserver <int>(i => onnext += i, ex => e = ex, () => { isCompleted = true; });

                disposable = observable.AsWeakObservable().Subscribe(o);
                weak       = new WeakReference <IObserver <int> >(o, true);
            };

            // execute inner method.
            exec();

            observable.OnNext(3);
            onnext.Is(3);

            observable.OnError(E);
            e.IsNotNull();

            observable.OnCompleted();
            isCompleted.IsTrue();

            // reset values.
            e           = null;
            isCompleted = false;

            // Force GC.
            GC.Collect(0, GCCollectionMode.Forced);
            GC.WaitForPendingFinalizers();
            GC.Collect(0, GCCollectionMode.Forced); // just to be sure
            System.Threading.Tasks.Task.Delay(100).Wait();

            // It should be notified. Because reference of IDisposable is alive and not unsubscribe automatically,
            // and so subscription is valid. Reference of IObserver<T> is kept internally, and was not collected by
            // the garbage collector.
            observable.OnNext(6);
            onnext.Is(9);

            observable.OnError(E);
            e.IsNotNull();

            observable.OnCompleted();
            isCompleted.IsTrue();
        }
Beispiel #4
0
        public void ImplicitReleaseByLostObserver()
        {
            int       onnext      = 0;
            Exception e           = null;
            bool      isCompleted = false;

            var         observable = new OnDemandObservable <int>();
            IDisposable disposable = null;
            WeakReference <IObserver <int> > weak = null;

            void exec()
            {
                var o = new DelegateObserver <int>(i => onnext += i, ex => e = ex, () => { isCompleted = true; });

                disposable = observable.VeryWeakSubscribe(o);
                weak       = new WeakReference <IObserver <int> >(o, true);
            };

            // execute inner method.
            exec();

            observable.OnNext(3);
            onnext.Is(3);

            observable.OnError(E);
            e.IsNotNull();

            observable.OnCompleted();
            isCompleted.IsTrue();

            // reset values.
            e           = null;
            isCompleted = false;

            // Force GC.
            GC.Collect(0, GCCollectionMode.Forced);
            GC.WaitForPendingFinalizers();
            GC.Collect(0, GCCollectionMode.Forced); // just to be sure
            System.Threading.Tasks.Task.Delay(100).Wait();

            observable.OnNext(6);
            onnext.Is(3);    // it should not be notified.

            observable.OnError(E);
            e.IsNull();

            observable.OnCompleted();
            isCompleted.IsFalse();
        }
        public void SpecifyFull()
        {
            int       t         = 0;
            bool      completed = false;
            Exception ee        = null;

            var testObservable = new OnDemandObservable <int>();
            var observer       = new DelegateObserver <int>(i => t = i, exception => ee = exception, () => completed = true);

            testObservable.Subscribe(observer);

            testObservable.OnNext(1);
            t.Is(1);

            testObservable.OnError(new Exception());
            ee.IsNotNull();

            testObservable.OnCompleted();
            completed.IsTrue();
        }
Beispiel #6
0
        public void KeepReferences()
        {
            int       onnext      = 0;
            Exception e           = null;
            bool      isCompleted = false;

            var observable = new OnDemandObservable <int>();
            var observer   = new DelegateObserver <int>(i => onnext += i, ex => e = ex, () => { isCompleted = true; });
            var dispose    = observable.WeakSubscribe(observer);

            // observer = null;

            observable.OnNext(3);
            onnext.Is(3);

            observable.OnError(E);
            e.IsNotNull();

            observable.OnCompleted();
            isCompleted.IsTrue();

            // reset values.
            e           = null;
            isCompleted = false;

            // Force GC.
            GC.Collect(0, GCCollectionMode.Forced);
            GC.WaitForPendingFinalizers();
            GC.Collect(0, GCCollectionMode.Forced); // just to be sure.
            System.Threading.Tasks.Task.Delay(100).Wait();

            observable.OnNext(6);
            onnext.Is(9);    // it should be notified.

            observable.OnError(E);
            e.IsNotNull();

            observable.OnCompleted();
            isCompleted.IsTrue();
        }
Beispiel #7
0
		private void Initialize()
		{
			this.positionChangesObservableSequence = new OnDemandObservable<TimeSpan>(o =>
			{
				var subscription = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)).Subscribe(
					async _ =>
					{
						try
						{
							var positionInfo = await this.avTransportService.GetPositionInfoAsync(0);

							if (this.currentPosition != positionInfo.RelativeTimePosition)
							{
								this.currentPosition = positionInfo.RelativeTimePosition;
								o.OnNext(positionInfo.RelativeTimePosition);
							}
						}
						catch (WebException ex)
						{
							this.logger.Instance().Warning(ex, "An error occurred when requesting position info", "Renderer".As(this.FriendlyName));
						}
						catch (FormatException ex)
						{
							this.logger.Instance().Warning(ex, "An error occurred when requesting position info", "Renderer".As(this.FriendlyName));
						}
						catch (UPnPServiceException ex)
						{
							this.logger.Instance().Warning(ex, "An error occurred when requesting position info", "Renderer".As(this.FriendlyName));
						}
					});

				return subscription.Dispose;
			});

			this.stateChangesObservableSequence = new OnDemandObservable<MediaRendererState>(o =>
			{
				var subscription = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)).Subscribe(
					async _ =>
					{
						try
						{
							var info = await this.avTransportService.GetTransportInfoAsync(0);
							var state = ParseTransportState(info.State);

							if (this.currentState != state)
							{
								this.currentState = state;
								o.OnNext(ParseTransportState(info.State));
							}
						}
						catch (WebException ex)
						{
							this.logger.Instance().Warning(ex, "An error occurred when requesting state info", "Renderer".As(this.FriendlyName));
						}
						catch (FormatException ex)
						{
							this.logger.Instance().Warning(ex, "An error occurred when requesting state info", "Renderer".As(this.FriendlyName));
						}
						catch (UPnPServiceException ex)
						{
							this.logger.Instance().Warning(ex, "An error occurred when requesting state info", "Renderer".As(this.FriendlyName));
						}
					});

				return subscription.Dispose;
			});
		}
Beispiel #8
0
        private void Initialize()
        {
            this.positionChangesObservableSequence = new OnDemandObservable <TimeSpan>(o =>
            {
                var subscription = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)).Subscribe(
                    async _ =>
                {
                    try
                    {
                        var positionInfo = await this.avTransportService.GetPositionInfoAsync(0);

                        if (this.currentPosition != positionInfo.RelativeTimePosition)
                        {
                            this.currentPosition = positionInfo.RelativeTimePosition;
                            o.OnNext(positionInfo.RelativeTimePosition);
                        }
                    }
                    catch (WebException ex)
                    {
                        this.logger.Instance().Warning(ex, "An error occurred when requesting position info", "Renderer".As(this.FriendlyName));
                    }
                    catch (FormatException ex)
                    {
                        this.logger.Instance().Warning(ex, "An error occurred when requesting position info", "Renderer".As(this.FriendlyName));
                    }
                    catch (UPnPServiceException ex)
                    {
                        this.logger.Instance().Warning(ex, "An error occurred when requesting position info", "Renderer".As(this.FriendlyName));
                    }
                });

                return(subscription.Dispose);
            });

            this.stateChangesObservableSequence = new OnDemandObservable <MediaRendererState>(o =>
            {
                var subscription = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)).Subscribe(
                    async _ =>
                {
                    try
                    {
                        var info  = await this.avTransportService.GetTransportInfoAsync(0);
                        var state = ParseTransportState(info.State);

                        if (this.currentState != state)
                        {
                            this.currentState = state;
                            o.OnNext(ParseTransportState(info.State));
                        }
                    }
                    catch (WebException ex)
                    {
                        this.logger.Instance().Warning(ex, "An error occurred when requesting state info", "Renderer".As(this.FriendlyName));
                    }
                    catch (FormatException ex)
                    {
                        this.logger.Instance().Warning(ex, "An error occurred when requesting state info", "Renderer".As(this.FriendlyName));
                    }
                    catch (UPnPServiceException ex)
                    {
                        this.logger.Instance().Warning(ex, "An error occurred when requesting state info", "Renderer".As(this.FriendlyName));
                    }
                });

                return(subscription.Dispose);
            });
        }