【发布时间】:2019-12-27 10:03:30
【问题描述】:
我正在使用 .NET Core 3.1 辅助服务模板来构建 Windows 服务。
我认为基本流程应该在ExecuteAsync 内处理,大致如下:
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
_Logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await SomeMethodThatDoesTheWork(stoppingToken);
}
catch (Exception ex)
{
_Logger.LogError(ex, "Global exception occurred. Will resume in a moment.");
}
await Task.Delay(TimeSpan.FromSeconds(10), stoppingToken);
}
}
我正在尝试从进程中正确发出我希望应用关闭的信号。
当停止服务时,我假设StopAsync() 被调用。这似乎工作正常。所以我认为await StopAsync() 可以解决问题,但之后ExecuteAsync 仍然会继续运行(所以我猜StopAsync 不会请求取消,而且你不应该自己调用它)。
所以我用另一个 bool 修改了我的循环:
while (!stoppingToken.IsCancellationRequested && !_ShuttingDown)
这确实退出了循环,并且再也不会进入ExecuteAsync。但是,该应用程序只是继续运行。根据调试器,它只是停留在host.Run()。
如何向应用程序主机发出我要关闭的信号?
【问题讨论】:
-
这能回答你的问题吗? Graceful shutdown of IHostedService
-
没有。第一个是相反的问题(服务显然被卡住了等待)。第二个很接近,但这不是 ASP.NET 上下文。但是,覆盖
StopAsync可能是必需的路径,但似乎不是正确的设计。 -
你能提供一些上下文吗,从自身关闭服务看起来并不常见。