private MeshNetworkMessageSubscriptionToken AddSubscriptionInternal<TMessage>(Action<TMessage> deliveryAction, Func<TMessage, bool> messageFilter, bool strongReference, IMeshNetworkMessageProxy proxy) where TMessage : class, IMeshNetworkMessage { if (deliveryAction == null) throw new ArgumentNullException("deliveryAction"); if (messageFilter == null) throw new ArgumentNullException("messageFilter"); if (proxy == null) throw new ArgumentNullException("proxy"); lock (_SubscriptionsPadlock) { var subscriptionToken = new MeshNetworkMessageSubscriptionToken(this, typeof(TMessage)); IMeshNetworkMessageSubscription subscription; if (strongReference) subscription = new StrongMeshNetworkMessageSubscription<TMessage>(subscriptionToken, deliveryAction, messageFilter); else subscription = new WeakMeshNetworkMessageSubscription<TMessage>(subscriptionToken, deliveryAction, messageFilter); _Subscriptions.Add(new SubscriptionItem(proxy, subscription)); return subscriptionToken; } }
/// <summary> /// Subscribe to a message type with the given destination and delivery action. /// Messages will be delivered via the specified proxy. /// All references (apart from the proxy) are held with strong references /// /// All messages of this type will be delivered. /// </summary> /// <typeparam name="TMessage">Type of message</typeparam> /// <param name="deliveryAction">Action to invoke when message is delivered</param> /// <param name="proxy">Proxy to use when delivering the messages</param> /// <returns>MeshMessageSubscription used to unsubscribing</returns> public MeshNetworkMessageSubscriptionToken Subscribe<TMessage>(Action<TMessage> deliveryAction, IMeshNetworkMessageProxy proxy) where TMessage : class, IMeshNetworkMessage { return AddSubscriptionInternal<TMessage>(deliveryAction, (m) => true, true, proxy); }
/// <summary> /// Subscribe to a message type with the given destination and delivery action with the given filter. /// Messages will be delivered via the specified proxy. /// All references are held with WeakReferences /// /// Only messages that "pass" the filter will be delivered. /// </summary> /// <typeparam name="TMessage">Type of message</typeparam> /// <param name="deliveryAction">Action to invoke when message is delivered</param> /// <param name="useStrongReferences">Use strong references to destination and deliveryAction </param> /// <param name="proxy">Proxy to use when delivering the messages</param> /// <returns>MeshMessageSubscription used to unsubscribing</returns> public MeshNetworkMessageSubscriptionToken Subscribe<TMessage>(Action<TMessage> deliveryAction, Func<TMessage, bool> messageFilter, bool useStrongReferences, IMeshNetworkMessageProxy proxy) where TMessage : class, IMeshNetworkMessage { return AddSubscriptionInternal<TMessage>(deliveryAction, messageFilter, useStrongReferences, proxy); }
public SubscriptionItem(IMeshNetworkMessageProxy proxy, IMeshNetworkMessageSubscription subscription) { Proxy = proxy; Subscription = subscription; }