Продление времени ожидания закрытия приложения - PullRequest
0 голосов
/ 15 января 2019

В моем приложении .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");

1 Ответ

0 голосов
/ 22 января 2019

В моем конкретном консольном приложении ASP.NET не было файла web.config, поэтому я создал один из них, а затем добавил свойство shutdownTimeLimit в раздел модуля aspNetCore.

<aspNetCore shutdownTimeLimit="20" processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false">
...