/// <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(); } }
public void RaiseCanExecuteChanged() { if (UIContext.CheckAccess()) { _canExecuteChangedSource.Raise(this, EventArgs.Empty); } else { UIContext.Run(() => _canExecuteChangedSource.Raise(this, EventArgs.Empty)).ObserveException(); } }