首页 > 解决方案 > 作为 Windows 服务运行时,在 .net core 3 的工作服务中未调用 StopAsync

问题描述

想知道你们以前是否遇到过这种情况。我想让 grpc server+web api 作为 Windows 服务运行,因为它意味着长时间运行的过程。Web API 基本上只是用于运行时监控内部状态。所以我创建了一个新的 grpc 服务(.net core 3),并添加了工作类,并添加了控制器等。并使用了 Microsoft.Extensions.Hosting .WindowsServices nuget 包以启用 Windows 服务。我用“sc create binpath= start= auto”安装它,然后用“sc start”启动它。观察日志文件,我可以看到它已经启动,访问swagger页面,我可以看到它运行良好。

当在工作人员类中调用 StartAsync 和 StopAsync 时,我将某些内容记录到日志文件中,并且我可以看到,当服务启动时,应该调用 StartAsync。

现在有趣的是,当系统重新启动时,我没有看到 StopAsync 被调用..

在 DOS 中,如果我使用 dotnet .exe 运行它,则会调用 StartAsync,按 CTRL+C 停止它,调用 StopAsync .. 但是为什么当它作为 Windows 服务运行并重新启动系统时没有调用 StopAsync?这是windwos服务nuget包本身的错误吗?还是我在这里遗漏了什么?

有趣的是,在 Startup 类中,我什至使用 IHostApplicationLifetime 来拦截 ApplicationStarting、ApplicationStopping ,但是再次调用了starting,但没有调用stopping ..为什么?

有人可以启发我吗?

标签: .net-corewindows-servicesbackground-service

解决方案


.net core 团队的好人已经知道这个问题,并将在 .net core 5.0 中解决它。参考这里:https ://github.com/aspnet/Extensions/pull/2705

预计 2020 年底。


推荐阅读