コード例 #1
0
        public IDisposable Subscribe(
            IMessagingSession messagingSession,
            string destination,
            Action <BinaryMessage, Action <bool> > callback,
            string messageType,
            int priority)
        {
            if (m_IsDisposing)
            {
                throw new ObjectDisposedException("ProcessingGroup " + Name);
            }
            var taskFactory  = m_SchedulingStrategy.GetTaskFactory(priority);
            var subscription = new SingleAssignmentDisposable();

            subscription.Disposable = messagingSession.Subscribe(destination, (message, ack) =>
            {
                Interlocked.Increment(ref m_TasksInProgress);
                taskFactory.StartNew(() =>
                {
                    Interlocked.Increment(ref m_ReceivedMessages);
                    //if subscription is disposed unack message immediately
                    if (subscription.IsDisposed)
                    {
                        ack(false);
                    }
                    else
                    {
                        callback(message, ack);
                        Interlocked.Increment(ref m_ProcessedMessages);
                    }
                    Interlocked.Decrement(ref m_TasksInProgress);
                }, TaskCreationOptions.HideScheduler);
            }, messageType);
            return(subscription);
        }