В моем приложении .NET Core 2.1
есть служба, унаследованная от класса BackgroundService
, которая запускает долгосрочную службу в новом потоке. Затем этот сервис обращается к сервису с ограниченным объемом, который читает из базы данных и отправляет некоторые электронные письма. Я пытаюсь протестировать обработку изящного завершения работы приложения, но в моем сценарии тестирования возникает странная проблема.
После прочтения записи блога MSDN для BackgroundService упоминается:
"По умолчанию токен отмены установлен с 5-секундным таймаутом, хотя вы можете изменить это значение при создании WebHost с помощью расширения UseShutdownTimeout IWebHostBuilder. Это означает, что наш сервис должен отменить в течение 5 секунд, в противном случае он будет более внезапно убит. "
Следующий код изменит это время на 10 секунд.
WebHost.CreateDefaultBuilder (арг)
.UseShutdownTimeout (TimeSpan.FromSeconds (10)) * * 1016
...
В моем файле Program.cs
я реализовал этот метод расширения (и также пытался использовать метод UseSettings
), чтобы попытаться продлить отключение по таймауту следующим образом:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseSerilog()
//.UseSetting(WebHostDefaults.ShutdownTimeoutKey, "20")
.UseShutdownTimeout(TimeSpan.FromSeconds(20))
.Build();
У меня есть точка останова в моей службе с ограничениями, где я пытаюсь проверить добавление этого тайм-аута, установив ожидание на 10 секунд и закрыв консоль, чтобы инициировать отключение, когда поток ожидает. Однако я обнаружил, что через 5 секунд после начала выключения приложение завершается, как будто оно все еще использует значение по умолчанию 5 секунд для выключения вместо нового 20. Что может быть причиной такого поведения?
Log.Information("preparing to sleep thread for 10 seconds");
//Thread.Sleep(10000);
await Task.Delay(TimeSpan.FromSeconds(10));
Log.Information("thread awakened");