Использование dotnet core 2.1 У меня есть класс BackgroundService, который создается при запуске как HostedService. Этот сервис потребляет элементы из очереди, если таковые имеются, ожидая в ExecuteAsync:
while (!stoppingToken.IsCancellationRequested)
{
try
{
WorkItem workItem = await TaskQueue.DequeueAsync(stoppingToken);
}
...
}
В производстве все это находится внутри dll в контейнере док-станции, инициализированном с помощью k5start, который обеспечивает непрерывную аутентификацию контейнера.
При мониторинге этой службы я вижу, что все работает нормально в течение определенного периода времени (в последних журналах служба потребляет задания, как только они добавляются в TaskQueue
в течение 3 дней), но затем просто останавливается. Задания продолжают добавляться в очередь (из контроллера API), но больше не возвращается из ожидающего DequeueAsync.
Метод StopAsync не был вызван, поэтому, насколько я могу судить, этот поток просто ожидает DequeueAsync, который никогда не возвращается даже с элементами в TaskQueue
.
Так что я застрял в том, как даже отладить это - и любые предложения будут оценены.
EDIT:
Фактическая очередь в значительной степени основана на этой статье:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.2&tabs=visual-studio#feedback
Там, где у класса есть семафор, который высвобождает поток для использования, как только в очереди и в DequeueAsync, на который есть ссылка в приведенном выше коде, есть работа, только что ожидает сигнала. WaitAsync, который бесконечно удерживает цикл до тех пор, пока работа не будет в очереди.