.NET Core / .NET 5 中 BackgroundService 中 ServiceBase.OnCustomCommand 的等价物

Equivalent of ServiceBase.OnCustomCommand in BackgroundService in .NET Core / .NET 5

我使用 BackgroundService worker 在 .NET Core(也在 .NET 5)中创建了一个 Windows 服务,运行 它作为一个 Windows 服务使用IHostBuilder.UseWindowsService() 电话。

我的问题是,如何捕获 Windows 服务命令,例如

sc.exe control <my service name> 200

据我所知,在这种构建 Windows 服务的新方式中,我无法捕捉到与旧 ServiceBase.OnCustomCommand 相当的东西。

如能提供有关如何捕获这些命令的任何帮助,我们将不胜感激。即使答案只是 “返回为您的 Windows 服务使用 ServiceBase”

谢谢!

对于仍在寻找答案的任何人。请参阅 this answer on github 以获取解决方案

基本上是要注册一个自定义的IHostLifetime实现:

Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    .ConfigureServices((hostContext, services) =>
    {
        if (WindowsServiceHelpers.IsWindowsService())
            services.AddSingleton<IHostLifetime, CustomService>();
    })

实际实现可能继承自 WindowsServiceLifetime,您可以在其中覆盖 OnCustomCommand 方法:

/// <summary>
/// Will handle custom service commands
/// </summary>
/// <param name="command">The command message sent to the service.</param>
protected override void OnCustomCommand(int command)
{
    _logger.LogInformation("Received custom service control command: {0}", command);
    switch (command)
    {
        case PreShutdownCommandCode:
            // Handle your custom command code
            break;
        default:
            base.OnCustomCommand(command);
            break;
    }
}