Beispiel #1
0
        /// <summary>
        /// Publish an event
        /// </summary>
        /// <typeparam name="TEventType"></typeparam>
        /// <param name="eventToPublish"></param>
        public void PublishEvent <TEventType>(TEventType eventToPublish)
        {
            if (eventToPublish is AggregatedEvent)
            {
                AggregatedEvent aggEvent = eventToPublish as AggregatedEvent;
                if (aggEvent.IsHandled)
                {
                    return;
                }
            }

            var subsriberType = typeof(ISubscriber <>).MakeGenericType(typeof(TEventType));

            var subscribers = GetSubscriberList(subsriberType);

            List <WeakReference> subsribersToBeRemoved = new List <WeakReference>();

            foreach (var weakSubsriber in subscribers)
            {
                if (weakSubsriber.IsAlive)
                {
                    var subscriber = (ISubscriber <TEventType>)weakSubsriber.Target;

                    InvokeSubscriberEvent <TEventType>(eventToPublish, subscriber);
                }
                else
                {
                    subsribersToBeRemoved.Add(weakSubsriber);
                } //End-if-else (weakSubsriber.IsAlive)
            }     //End-for-each (var weakSubriber in subscribers)


            if (subsribersToBeRemoved.Any())
            {
                lock (lockSubscriberDictionary)
                {
                    foreach (var remove in subsribersToBeRemoved)
                    {
                        subscribers.Remove(remove);
                    } //End-for-each (var remove in subsribersToBeRemoved)
                }     //End-lock (lockSubscriberDictionary)
            }         //End-if (subsribersToBeRemoved.Any())
        }
Beispiel #2
0
        private void InvokeSubscriberEvent <TEventType>(TEventType eventToPublish, ISubscriber <TEventType> subscriber)
        {
            //Synchronize the invocation of method

            SynchronizationContext syncContext = SynchronizationContext.Current;

            if (syncContext == null)
            {
                syncContext = new SynchronizationContext();
            }//End-if (syncContext == null)

            if (eventToPublish is AggregatedEvent)
            {
                AggregatedEvent aggEvent = eventToPublish as AggregatedEvent;
                if (aggEvent.IsHandled)
                {
                    return;
                }
            }

            subscriber.OnEventHandler(eventToPublish);

            //syncContext.Post(s => subscriber.OnEventHandler(eventToPublish), null);
        }