/// <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));
        }
Exemplo n.º 2
0
 public void Cleanup()
 {
     SubscriberScheduler.Dispose();
     PublisherScheduler.Dispose();
 }