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); }