BackgroundService 崩溃时主机未停止

Host is not stopped when BackgroundService crashes

请参阅下面的示例代码。 我希望主机在后台服务崩溃时自动停止,但事实并非如此。结果是 Windows 服务看起来是 运行 但它不执行任何工作... 如何确保程序检测到后台服务已停止?

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    
    namespace WorkerTest
    {
        public static class Program
        {
            public static void Main(string[] args)
            {
                CreateHostBuilder(args).Build().Run();
            }
    
            private static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .UseWindowsService()
                    .ConfigureServices((hostContext, services) =>
                    {
                        services.AddHostedService<Worker>();
                    });
        }
    
        public class Worker : BackgroundService
        {
            private readonly ILogger<Worker> _logger;
            private int _counter;
    
            public Worker(ILogger<Worker> logger)
            {
                _logger = logger;
            }
    
            protected override async Task ExecuteAsync(CancellationToken stoppingToken)
            {
                try
                {
                    while (!stoppingToken.IsCancellationRequested)
                    {
                        _logger.LogInformation("Worker running at: {time} ({counter})", DateTimeOffset.Now, _counter++);
                        if (_counter > 10)
                            throw new Exception("Something happened!");
                        await Task.Delay(1000, stoppingToken).ConfigureAwait(false);
                    }
                }
                finally
                {
                    if (!stoppingToken.IsCancellationRequested)
                        _logger.LogError("Worker stopped unexpectedly");
                }
            }
        }
    
    }

您可以运行以下操作以确保服务按预期关闭:

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            try
            {
                while (!stoppingToken.IsCancellationRequested)
                {
                    _logger.LogInformation("Worker running at: {time} ({counter})", DateTimeOffset.Now, _counter++);
                    if (_counter > 10)
                        throw new Exception("Something happened!");
                    await Task.Delay(1000, stoppingToken).ConfigureAwait(false);
                }
            }
            catch (Exception)
            {
                 _applicationLifeTime.StopApplication();
            }
            finally
            {
                if (!stoppingToken.IsCancellationRequested)
                    _logger.LogError("Worker stopped unexpectedly");
                   
            }
        }

为此,您需要将 IApplicationLifetime 注入 BackgroundService