public IDisposable Subscribe(IObserver <WorkItemUpdateData> observer) { ObserverSubscription observerSubscription = new ObserverSubscription( observer, Unsubscribe); Observers.Add(observerSubscription); return(observerSubscription); }
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 } }
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); } }); } }