Фоновая служба (IHostedService), по-видимому, преждевременно завершена - PullRequest
0 голосов
/ 02 июля 2019

Использование 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, который бесконечно удерживает цикл до тех пор, пока работа не будет в очереди.

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