Exemplo n.º 1
0
        /// <summary>
        /// Publishes a message.
        /// </summary>
        /// <param name="message">The message instance.</param>
        public void Publish(object message)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            List <IEventAggregatorHandler> selectedHandlers;

            lock (_handlers)
            {
                _handlers.RemoveAll(h => h.IsDead);
                selectedHandlers = _handlers.FindAll(h => h.CanHandle(message));
            }

            if (selectedHandlers.Count == 0)
            {
                return;
            }
            var isUIThread = UIContext.CheckAccess();

            var currentThreadHandlers = selectedHandlers
                                        .Where(h => h.ThreadOption == ThreadOption.PublisherThread ||
                                               isUIThread && h.ThreadOption == ThreadOption.UIThread);

            foreach (var h in currentThreadHandlers)
            {
                h.Handle(message);
            }

            if (!isUIThread)
            {
                var uiThreadHandlers = selectedHandlers.FindAll(h => h.ThreadOption == ThreadOption.UIThread);
                if (uiThreadHandlers.Count > 0)
                {
                    UIContext.Run(() => { foreach (var h in uiThreadHandlers)
                                          {
                                              h.Handle(message);
                                          }
                                  }).ObserveException();
                }
            }

            var backgroundThreadHandlers = selectedHandlers.FindAll(h => h.ThreadOption == ThreadOption.BackgroundThread);

            if (backgroundThreadHandlers.Count > 0)
            {
                Task.Run(() => { foreach (var h in backgroundThreadHandlers)
                                 {
                                     h.Handle(message);
                                 }
                         }).ObserveException();
            }
        }
Exemplo n.º 2
0
 public void RaiseCanExecuteChanged()
 {
     if (UIContext.CheckAccess())
     {
         _canExecuteChangedSource.Raise(this, EventArgs.Empty);
     }
     else
     {
         UIContext.Run(() => _canExecuteChangedSource.Raise(this, EventArgs.Empty)).ObserveException();
     }
 }
Exemplo n.º 3
0
        /// <summary>
        /// Publishes a message.
        /// </summary>
        /// <param name="message">The message instance.</param>
        public void Publish(object message)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            List <IEventAggregatorHandler> selectedHandlers;

            lock (_handlers)
            {
                _handlers.RemoveAll(h => h.IsDead);
                selectedHandlers = _handlers.FindAll(h => h.CanHandle(message));
            }

            if (selectedHandlers.Count == 0)
            {
                return;
            }

            var isUIThread            = UIContext.CheckAccess();
            var currentThreadHandlers = selectedHandlers.FindAll(h => h.ThreadOption == ThreadOption.PublisherThread || isUIThread && h.ThreadOption == ThreadOption.UIThread);

            if (currentThreadHandlers.Count > 0)
            {
                PublishCore(message, currentThreadHandlers);
            }

            if (!isUIThread)
            {
                var uiThreadHandlers = selectedHandlers.FindAll(h => h.ThreadOption == ThreadOption.UIThread);
                if (uiThreadHandlers.Count > 0)
                {
                    UIContext.BeginInvoke(() => PublishCore(message, uiThreadHandlers));
                }
            }


            var backgroundThreadHandlers = selectedHandlers.FindAll(h => h.ThreadOption == ThreadOption.BackgroundThread);

            if (backgroundThreadHandlers.Count > 0)
            {
                ThreadPool.Post(state => PublishCore(message, backgroundThreadHandlers), null);
            }
        }