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); } }
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 }); }
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(); } }