Beispiel #1
0
        /// <summary>
        /// Clears the given MessageSubscription.
        /// </summary>
        /// <param name="messageSubscription">The subscription to clear.</param>
        public void Unsubscribe(MessageSubscription messageSubscription)
        {
            messageSubscription.EnsureNotNull(nameof(messageSubscription));

            if (messageSubscription != null && !messageSubscription.IsDisposed)
            {
                Type messageType = messageSubscription.MessageType;

                //Remove subscription from internal list

                lock (m_messageSubscriptionsLock)
                {
                    if (m_messageSubscriptions.ContainsKey(messageType))
                    {
                        List <MessageSubscription> listOfSubscriptions = m_messageSubscriptions[messageType];
                        listOfSubscriptions.Remove(messageSubscription);
                        if (listOfSubscriptions.Count == 0)
                        {
                            m_messageSubscriptions.Remove(messageType);
                        }
                    }
                }

                //Clear given subscription
                messageSubscription.Clear();
            }
        }
Beispiel #2
0
        /// <summary>
        /// Subscribes to the given message type.
        /// </summary>
        /// <param name="messageType">The type of the message.</param>
        /// <param name="actionOnMessage">Action to perform on incoming message.</param>
        public MessageSubscription Subscribe(
            Delegate actionOnMessage, Type messageType)
        {
            actionOnMessage.EnsureNotNull(nameof(actionOnMessage));
            messageType.EnsureNotNull(nameof(messageType));

            if (!messageType.GetTypeInfo().IsSubclassOf(typeof(SeeingSharpMessage)))
            {
                throw new ArgumentException("Given message type does not derive from SeeingSharpMessage!");
            }

            MessageSubscription newOne = new MessageSubscription(this, messageType, actionOnMessage);

            lock (m_messageSubscriptionsLock)
            {
                if (m_messageSubscriptions.ContainsKey(messageType))
                {
                    m_messageSubscriptions[messageType].Add(newOne);
                }
                else
                {
                    List <MessageSubscription> newList = new List <MessageSubscription>();
                    newList.Add(newOne);
                    m_messageSubscriptions[messageType] = newList;
                }
            }

            return(newOne);
        }
Beispiel #3
0
        /// <summary>
        /// Subscribes to the given MessageType during the livetime of the given control.
        /// Events OnHandleCreated and OnHandleDestroyed are used for subscribing / unsubscribing.
        /// </summary>
        /// <typeparam name="MessageType">Type of the message.</typeparam>
        /// <param name="actionOnMessage">Action to perform on incoming message.</param>
        /// <param name="target">The target control.</param>
        public void SubscribeOnControl <MessageType>(System.Windows.Forms.Control target, Action <MessageType> actionOnMessage)
            where MessageType : SeeingSharpMessage
        {
            target.EnsureNotNull(nameof(target));
            actionOnMessage.EnsureNotNull(nameof(actionOnMessage));
            MessageSubscription subscription = null;

            //Create handler delegates
            EventHandler onHandleCreated = (sender, eArgs) =>
            {
                if (subscription == null)
                {
                    subscription = Subscribe(actionOnMessage);
                }
            };
            EventHandler onHandleDestroyed = (inner, eArgs) =>
            {
                if (subscription != null)
                {
                    Unsubscribe(subscription);
                    subscription = null;
                }
            };

            //Attach to events and subscribe on message, if handle is already created
            target.HandleCreated   += onHandleCreated;
            target.HandleDestroyed += onHandleDestroyed;
            if (target.IsHandleCreated)
            {
                subscription = Subscribe(actionOnMessage);
            }
        }
Beispiel #4
0
        /// <summary>
        /// Waits for the given message.
        /// </summary>
        public Task <T> WaitForMessageAsync <T>()
            where T : SeeingSharpMessage
        {
            TaskCompletionSource <T> taskComplSource = new TaskCompletionSource <T>();

            MessageSubscription subscription = null;

            subscription = this.Subscribe <T>((message) =>
            {
                // Unsubscribe first
                subscription.Unsubscribe();

                // Set the task's result
                taskComplSource.SetResult(message);
            });

            return(taskComplSource.Task);
        }