/// <summary> /// Notifies the provider that an observer is to receive notifications. /// </summary> /// <returns> /// A reference to an interface that allows observers to stop receiving notifications before the provider has finished sending them. /// </returns> /// <param name="observer">The object that is to receive notifications.</param> public override IDisposable Subscribe(IObserver <T> observer) { if (observer == null) { throw new ArgumentNullException("observer"); } if (_internalSubscription != null) { _internalSubscription.Dispose(); } Observers.Add(observer); _subscribeSubscription = SubscriberScheduler .Schedule( observer, (s, o) => { _internalSubscription = _trigger .Select( x => { var filter = Expression as MethodCallExpression; var parameterBuilder = new ParameterBuilder(RestClient.ServiceBase, typeof(TSource)); IObservable <T> source = null; using (var waitHandle = new ManualResetEventSlim(false)) { SubscriberScheduler.Schedule(() => { try { source = Processor.ProcessMethodCall( filter, parameterBuilder, GetResults, GetIntermediateResults); } catch (Exception e) { source = Observable.Throw(e, default(T)); } finally { waitHandle.Set(); } }); waitHandle.Wait(); } return(source); }) .SelectMany(y => y) .Subscribe(new ObserverPublisher <T>(Observers, ObserverScheduler)); }); return(new RestSubscription <T>(observer, Unsubscribe)); }
public void Cleanup() { SubscriberScheduler.Dispose(); PublisherScheduler.Dispose(); }