/// <summary> /// Метод, выполняющий запуск потоков отправки для каждой подписки. /// </summary> private void SendMsgsByCallBack() { try { // Ищем актуальные подписки, для которых есть сообщения. IEnumerable <Subscription> callbackSubscriptions = _subscriptionsManager.GetCallbackSubscriptions().Where(x => GetCurrentMessageCount(x.Client.ID, x.MessageType.ID) > 0); try { foreach (var subscription in callbackSubscriptions) { SubscriberThreadPool.QueueUserWorkItem(subscription, _scanninWaitEvent, _statistics, _dataService, _logger); } SubscriberThreadPool.CheckForUnActiveSubscribers(); } catch (Exception e) { _logger.LogUnhandledException(e, null, "Ошибка при порождении потоков подписчиков через QueueUserWorkItem."); } } catch (Exception e) { _logger.LogUnhandledException(e, null, "Ошибка при получении активных подписок, отправляемых по Callback."); } }
/// <summary> /// Поток сканирующий БД на наличие подписок. /// </summary> private void ScanMessages() { try { // Notify main thread that scanning thread has started. _scanningStartedEvent.Set(); while (true) { if (_requestStopScanning) { SubscriberThreadPool.ReleaseAllSubscriptionThreads(); return; } try { SendMsgsByCallBack(); } catch (Exception ex) { _logger.LogUnhandledException(ex); } _scanninWaitEvent.WaitOne(ScanningPeriodMilliseconds); } } catch (Exception e) { _logger.LogUnhandledException(e); } finally { // Notify main thread that scanning thread has stopped. _scanningStoppedEvent.Set(); } }