Ejemplo n.º 1
0
        /// <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));
        }
Ejemplo n.º 2
0
        /// <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;
                }
            }
        }
Ejemplo n.º 3
0
 public WspSubscriptionDisposable(WspEventObservable parent, SubscriptionObserver subscriptionObserver)
 {
     this.parent = parent;
     this.subscriptionObserver = subscriptionObserver;
 }