我对 ASP.NET Core 完全陌生,所以我可能错过了 50 英里的东西,因为我在这上面花了 3 个小时却无济于事。
我在 VS 2017 中制作了一个 Web 应用程序,由 Kestrel 托管,在 IIS Express 下运行(当您创建一个新的 Web 应用程序时,这都是默认设置)。当我按下 F5 时,应用程序启动,我的 Chrome 浏览器打开,我看到了“hello world”式的输出。当我关闭此浏览器窗口时,应用程序终止。
现在,我需要在后台执行一些任务,并且我需要这些任务具有清理逻辑——我发现它IHostedService
允许我这样做。
该文档指出:
当您注册 IHostedService 时,.NET Core 将分别在应用程序启动和停止期间调用您的 IHostedService 类型的 StartAsync() 和 StopAsync() 方法。
我已经做好了:
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<MyBackgroundService>();
}
服务按预期启动,一切都很好。极其简单的东西。但它永远不会停止,至少不会优雅地停止。
当我关闭该自动启动的浏览器窗口时,我的应用程序也会随之关闭,但我的IHostedService
服务中有此方法:
public Task StopAsync(CancellationToken cancellationToken)
{
...
}
永远不会被调用。
我已经尝试过文档中提供的示例,但它表现出同样的问题——当我在 VS 中尝试时,清理工作从未完成。
我注意到来自名为“ASP.NET Core Web Server”的输出通道的特殊信息:
BackgroundTasksSample> Application started. Press Ctrl+C to shut down.
这显然是来自控制台的一些重定向,因为这个应用程序似乎首先是一个控制台应用程序。所以我想知道 VS 是否会通过看似对我隐藏控制台来阻止我优雅地关闭我的应用程序?
我还注意到一个小的 IIS Express 托盘图标,其中列出了我运行的所有应用程序,并且它有一个停止按钮,它似乎没有做任何事情。我假设 IIS Express 在这里只是充当某种代理。
我傻眼了,特别是因为我似乎是唯一一个有这个问题的人。
如何正确终止我的 Web 应用程序?