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(); }
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(); }
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(); }
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(); }
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; }); }
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); }); }