private MessengerSubscriptionToken SubscribeInternal <TMessage>(Action <TMessage> deliveryAction, IActionRunner actionRunner, MessengerReference reference, string tag) where TMessage : MessengerMessage { if (deliveryAction == null) { throw new ArgumentNullException(nameof(deliveryAction)); } BaseSubscription subscription; switch (reference) { case MessengerReference.Strong: subscription = new StrongSubscription <TMessage>(actionRunner, deliveryAction, tag); break; case MessengerReference.Weak: subscription = new WeakSubscription <TMessage>(actionRunner, deliveryAction, tag); break; default: throw new ArgumentOutOfRangeException(nameof(reference), "reference type unexpected " + reference); } lock (this) { Dictionary <Guid, BaseSubscription> messageSubscriptions; if (!_subscriptions.TryGetValue(typeof(TMessage), out messageSubscriptions)) { messageSubscriptions = new Dictionary <Guid, BaseSubscription>(); _subscriptions[typeof(TMessage)] = messageSubscriptions; } //Console.WriteLine("Adding subscription {0} for {1}", subscription.Id, typeof(TMessage).Name); messageSubscriptions[subscription.Id] = subscription; PublishSubscriberChangeMessage <TMessage>(messageSubscriptions); } return(new MessengerSubscriptionToken( subscription.Id, () => InternalUnsubscribe <TMessage>(subscription.Id), deliveryAction)); }
public MessengerSubscriptionToken SubscribeOnThreadPoolThread <TMessage>(Action <TMessage> deliveryAction, MessengerReference reference = MessengerReference.Weak, string tag = null) where TMessage : MessengerMessage { return(SubscribeInternal(deliveryAction, new ThreadPoolActionRunner(), reference, tag)); }