В рамках нашей сервисной архитектуры у нас есть фоновый процесс, который отслеживает очередь и обрабатывает сообщения из нее. Если что-то пытается остановить службу, мы бы хотели, чтобы этот фоновый процесс завершил 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 процесс остановится и завершится корректно. Это явно не происходит. Что следует изменить здесь?