Exemple #1
0
        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));
        }
Exemple #2
0
 public MessengerSubscriptionToken SubscribeOnThreadPoolThread <TMessage>(Action <TMessage> deliveryAction, MessengerReference reference = MessengerReference.Weak, string tag = null)
     where TMessage : MessengerMessage
 {
     return(SubscribeInternal(deliveryAction, new ThreadPoolActionRunner(), reference, tag));
 }