Я совершенно новичок в ASP.NET Core, поэтому, возможно, мне чего-то не хватает на 50 миль, потому что я потратил 3 часа на это безрезультатно.
Я создал веб-приложение из VS 2017, размещенное на Kestrel, которое работает под управлением IIS Express (все это по умолчанию при создании нового веб-приложения). Когда я нажимаю F5, приложение запускается, открывается мой браузер Chrome, и я вижу вывод «Привет, мир». Когда я закрываю это окно браузера, приложение закрывается.
Теперь мне нужны некоторые задачи, выполняемые в фоновом режиме, и мне нужно, чтобы эти задачи имели логику очистки - я обнаружил, что IHostedService
позволяет мне это делать.
В документации указано:
Когда вы регистрируете IHostedService, .NET Core вызывает методы StartAsync () и StopAsync () вашего типа IHostedService во время запуска и остановки приложения соответственно.
Я сделал:
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<MyBackgroundService>();
}
И служба запускается как положено, все хорошо. Чрезвычайно простые вещи. Но это никогда не останавливается, по крайней мере, изящно.
Когда я закрываю это автоматически запускаемое окно браузера, мое приложение закрывается вместе с ним, но этот метод в моей службе IHostedService
:
public Task StopAsync(CancellationToken cancellationToken)
{
...
}
никогда не вызывается.
Я попробовал пример , приведенный в документации , и он показывает ту же проблему - очистка никогда не выполняется, когда я пробую его в VS.
Я заметил необычную информацию из выходного канала под названием «Базовый веб-сервер ASP.NET»:
BackgroundTasksSample> Application started. Press Ctrl+C to shut down.
Это, очевидно, некоторое перенаправление с консоли, так как это приложение в первую очередь выглядит как консольное приложение. Так что мне интересно, не мешает ли VS, по-видимому, скрыть от меня консоль и помешать мне выполнить корректное завершение работы моего приложения?
Я также заметил небольшую иконку в трее IIS Express, на которой перечислены все запущенные мной приложения, а также кнопка «Стоп», которая, похоже, ничего не делает. Я предполагаю, что IIS Express здесь просто действует как своего рода прокси.
Я ошеломлен, тем более что я, кажется, единственный, у кого есть эта проблема.
Как мне правильно завершить мое веб-приложение?