Предотвращение отключения службы до тех пор, пока IHosted не завершит работу - PullRequest
0 голосов
/ 05 марта 2020

В рамках нашей сервисной архитектуры у нас есть фоновый процесс, который отслеживает очередь и обрабатывает сообщения из нее. Если что-то пытается остановить службу, мы бы хотели, чтобы этот фоновый процесс завершил sh текущую «партию» и затем корректно завершил работу. Тем не менее, похоже, что это не происходит (он немедленно умирает).

    public class MessageQueueProcessorBackground : IHostedService, IDisposable
    {
        private readonly IServiceProvider _services;
        private readonly ILogger<MessageQueueProcessorBackground> _logger;
        private bool _disposing = false;

        private const int NUMBER_OF_MESSAGES_TO_PROCESS = 10;

        public MessageQueueProcessorBackground(ILogger<MessageQueueProcessorBackground> logger, IServiceProvider services)
        {
            _logger = logger;
            _services = services;
        }

        public void Dispose()
        {
            Dispose(_disposing);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!disposing)
            {
                _disposing = true;
            }
        }

        public Task StartAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation($"Staring Message Queue Processor");
            new Timer(BeginProcessingAsync, null, TimeSpan.Zero, TimeSpan.Zero);
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            _logger.LogInformation($"Stopping Message Queue Processor");

            return Task.CompletedTask;
        }
        private void BeginProcessingAsync(object state)
        {
            while (!_disposing)
            {
                ProcessQueue();
            }
        }

        private void ProcessQueue()
        {
           // does some work
        }

        // Finalizer to facilitate garbage collection
        ~MessageQueueProcessorBackground()
        {
            Dispose(false);
        }

Более или менее этот процесс продолжает обрабатывать записи, пока их нет, затем некоторое время ждет, прежде чем попытаться снова (ожидание в коде ProcessQueue). Идея, более или менее, заключается в том, что на следующем «l oop» после вызова dispose процесс остановится и завершится корректно. Это явно не происходит. Что следует изменить здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...