/// <summary> /// Subscribe method to provide an observer /// </summary> /// <param name="observer">The observer to be called for each event</param> /// <returns></returns> public IDisposable Subscribe(IObserver <WspEvent> observer) { SubscriptionObserver subscriptionObserver; lock (lockObj) { if (eventObservables.Count == 0) { initialEventType = eventType; initialLocalOnly = localOnly; initialMethodBody = methodBody; initialUsingLibraries = usingLibraries; initialReferencedAssemblies = referencedAssemblies; } wspSubscriptionManager.AddSubscription(eventType, localOnly, methodBody, usingLibraries, referencedAssemblies); subscriptionObserver = new SubscriptionObserver(observer); List <SubscriptionObserver> observers; if (observables.TryGetValue(this.id, out observers) == false) { observers = new List <SubscriptionObserver>(); observables[this.id] = observers; } observers.Add(subscriptionObserver); List <WspEventObservable> observableList; if (eventObservables.TryGetValue(this.eventType, out observableList) == false) { observableList = new List <WspEventObservable>(); eventObservables[this.eventType] = observableList; } bool observableExists = false; for (int i = 0; i < observableList.Count; i++) { if (observableList[i].id == this.id) { observableExists = true; break; } } if (observableExists == false) { observableList.Add(this); } } return(new WspSubscriptionDisposable(this, subscriptionObserver)); }
/// <summary> /// Dispose for the ObservableSubscription object /// </summary> /// <param name="subscriptionObserver">Observer to be disposed</param> private void Dispose(SubscriptionObserver subscriptionObserver) { lock (lockObj) { List <SubscriptionObserver> observers; if (observables.TryGetValue(this.id, out observers) == true) { for (int i = 0; i < observers.Count; i++) { if (subscriptionObserver.id == observers[i].id) { observers.RemoveAt(i); break; } } if (observers.Count == 0) { observables.Remove(this.id); List <WspEventObservable> observableList; if (eventObservables.TryGetValue(this.eventType, out observableList) == true) { for (int i = 0; i < observableList.Count; i++) { if (observableList[i].id == this.id) { observableList.RemoveAt(i); break; } } if (observableList.Count == 0) { eventObservables.Remove(this.eventType); } } this.Dispose(); } wspSubscriptionManager.RemoveSubscription(eventType, localOnly, methodBody, usingLibraries, referencedAssemblies); this.observableThread.Abort(); } try { subscriptionObserver.observerThread.Abort(); subscriptionObserver.eventQueueCounter.RemoveInstance(); } catch { } if (observables.Count == 0 && wspSubscriptionThread != null) { wspSubscriptionManager.StopListening = true; wspSubscriptionThread.Join(30000); wspSubscriptionThread = null; wspSubscriptionManager = null; } } }
public WspSubscriptionDisposable(WspEventObservable parent, SubscriptionObserver subscriptionObserver) { this.parent = parent; this.subscriptionObserver = subscriptionObserver; }