Exemple #1
0
        public IDisposable Subscribe(IObserver <WorkItemUpdateData> observer)
        {
            ObserverSubscription observerSubscription = new ObserverSubscription(
                observer, Unsubscribe);

            Observers.Add(observerSubscription);
            return(observerSubscription);
        }
Exemple #2
0
        private void Unsubscribe(ObserverSubscription observerToUnsubscribe)
        {
            ObserverSubscription reference =
                (from observerReference in Observers
                 where observerReference == observerToUnsubscribe
                 select observerReference).First();

            Observers.Remove(reference);
        }
        /// <summary>
        /// Subscribes sent observer to the observable stream.
        /// </summary>
        /// <param name="observer">The Observer to invoke when messages arrive.</param>
        /// <returns>Subscription. Dispose when done consuming.</returns>
        public IDisposable Subscribe(IObserver <T> observer)
        {
            if (observer == null)
            {
                throw new ArgumentNullException(nameof(observer));
            }

            var sub = new ObserverSubscription(observer, DisposeSubscription);

            if (!subscriptions.TryAdd(sub.Id, sub))
            {
                throw new ArgumentException("Could not subscribe observer. Ensure it has not already been subscribed.", nameof(observer));
            }

            return(sub);
        }
        private void DisposeSubscription(ObserverSubscription sub)
        {
            if (!subscriptions.TryRemove(sub.Id, out _))
            {
                return;
            }

            try
            {
                sub.Observer.OnCompleted();
            }
            catch
            {
                // ignored
            }
        }
Exemple #5
0
 private void NotifyProgress(WorkItemUpdateData message)
 {
     foreach (var observerReference in Observers)
     {
         ObserverSubscription reference = observerReference;
         Task.Factory.StartNew(() =>
         {
             try
             {
                 reference.Observer.OnNext(message);
             }
             catch (Exception ex)
             {
                 reference.Observer.OnError(ex);
             }
         });
     }
 }