Exemplo n.º 1
0
        List <WeakReference> GetSubscribers(Type subscriberType)
        {
            lock (Lock)
            {
                if (!EventSubscribers.TryGetValue(subscriberType, out List <WeakReference>?subscribers))
                {
                    subscribers = new List <WeakReference>();
                    EventSubscribers.Add(subscriberType, subscribers);
                }

                return(subscribers);
            }
        }
Exemplo n.º 2
0
        public void Subscribe <TEvent>(object subscriber, Action <TEvent> handler)
        {
            var type = typeof(TEvent);

            IEventSubscribers subscribers = null;

            if (!_subscribers.TryGetValue(type, out subscribers))
            {
                subscribers = new EventSubscribers <TEvent>();
                _subscribers.Add(type, subscribers);
            }

            var concrete = subscribers as EventSubscribers <TEvent>;

            concrete.Add(new EventSubscriberItem <TEvent>
            {
                Subscriber = subscriber,
                Handler    = handler
            });
        }
Exemplo n.º 3
0
        public void PublishEvent <TEvent>(TEvent @event) where TEvent : class, IEvent
        {
            Ensure.That(@event, () => @event).IsNotNull();

            var eventName = GetEventName(@event.GetType());

            /*
             *          int workerThreads;
             *          int completionPortThreads;
             *          ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads);
             *
             *          int maxCompletionPortThreads;
             *          int maxWorkerThreads;
             *          ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxCompletionPortThreads);
             *
             *
             *          int minCompletionPortThreads;
             *          int minWorkerThreads;
             *          ThreadPool.GetMinThreads(out minWorkerThreads, out minCompletionPortThreads);
             *
             *          _logger.Warn("Thread pool state WT:{0} PT:{1}  MAXWT:{2} MAXPT:{3} MINWT:{4} MINPT:{5}", workerThreads, completionPortThreads, maxWorkerThreads, maxCompletionPortThreads, minWorkerThreads, minCompletionPortThreads);
             */

            _logger.Trace("Publishing {0}", eventName);

            EventSubscribers <TEvent> subscribers;

            lock (_eventSubscribers)
            {
                object target;
                if (!_eventSubscribers.TryGetValue(eventName, out target))
                {
                    _eventSubscribers[eventName] = target = new EventSubscribers <TEvent>(_serviceFactory);
                }

                subscribers = target as EventSubscribers <TEvent>;
            }

            //call synchronous handlers first.
            var handlers = subscribers._syncHandlers;

            foreach (var handler in handlers)
            {
                try
                {
                    _logger.Trace("{0} -> {1}", eventName, handler.GetType().Name);
                    handler.Handle(@event);
                    _logger.Trace("{0} <- {1}", eventName, handler.GetType().Name);
                }
                catch (Exception e)
                {
                    _logger.Error(e, "{0} failed while processing [{1}]", handler.GetType().Name, eventName);
                }
            }

            foreach (var handler in subscribers._globalHandlers)
            {
                var handlerLocal = handler;

                _taskFactory.StartNew(() =>
                {
                    handlerLocal.HandleAsync(@event);
                }, TaskCreationOptions.PreferFairness)
                .LogExceptions();
            }

            foreach (var handler in subscribers._asyncHandlers)
            {
                var handlerLocal = handler;

                _taskFactory.StartNew(() =>
                {
                    _logger.Trace("{0} ~> {1}", eventName, handlerLocal.GetType().Name);
                    handlerLocal.HandleAsync(@event);
                    _logger.Trace("{0} <~ {1}", eventName, handlerLocal.GetType().Name);
                }, TaskCreationOptions.PreferFairness)
                .LogExceptions();
            }
        }