/// <summary> /// Checks the state of the subscriptions. /// </summary> public void PublishTimerExpired() { List <Subscription> subscriptionsToDelete = new List <Subscription>(); lock (m_lock) { List <QueuedSubscription> liveSubscriptions = new List <QueuedSubscription>(m_queuedSubscriptions.Count); // check each available subscription. for (int ii = 0; ii < m_queuedSubscriptions.Count; ii++) { QueuedSubscription subscription = m_queuedSubscriptions[ii]; PublishingState state = subscription.Subscription.PublishTimerExpired(); // check for expired subscription. if (state == PublishingState.Expired) { subscriptionsToDelete.Add(subscription.Subscription); ((SubscriptionManager)m_server.SubscriptionManager).SubscriptionExpired(subscription.Subscription); continue; } liveSubscriptions.Add(subscription); // check if idle. if (state == PublishingState.Idle) { subscription.ReadyToPublish = false; continue; } // do nothing if subscription has already been flagged as available. if (subscription.ReadyToPublish) { if (subscription.ReadyToPublish && m_queuedRequests.Count == 0) { if (!m_subscriptionsWaiting) { m_subscriptionsWaiting = true; // TraceState("SUBSCRIPTIONS WAITING"); } } continue; } // assign subscription to request if one is available. if (!subscription.Publishing) { AssignSubscriptionToRequest(subscription); } } // only keep the live subscriptions. m_queuedSubscriptions = liveSubscriptions; // schedule cleanup on a background thread. SubscriptionManager.CleanupSubscriptions(m_server, subscriptionsToDelete); } }