在.NET控制台应用中继承BaseServices/IHostedServices的方法探讨
无需依赖Worker模板,手动给控制台应用添加Hosted Service支持
完全不需要必须用dotnet new worker命令,你可以直接在现有控制台项目里手动添加相关依赖和代码,实现和Worker模板一致的启停控制逻辑,步骤如下:
添加核心NuGet依赖
首先安装Hosted Service的基础包,在项目目录执行命令:dotnet add package Microsoft.Extensions.Hosting创建自定义Hosted Service类
有两种实现方式,推荐继承BackgroundService(它是IHostedService的抽象实现,帮你封装了基础启停逻辑),示例代码:using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System.Threading; using System.Threading.Tasks; public class CustomHostedService : BackgroundService { private readonly ILogger<CustomHostedService> _logger; public CustomHostedService(ILogger<CustomHostedService> logger) { _logger = logger; } // 服务启动后执行的核心业务逻辑 protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("自定义服务已启动"); while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("服务正在运行中..."); await Task.Delay(1000, stoppingToken); } _logger.LogInformation("服务即将停止"); } // 可选:重写此方法添加自定义停止逻辑 public override async Task StopAsync(CancellationToken cancellationToken) { _logger.LogInformation("执行自定义停止清理操作"); await base.StopAsync(cancellationToken); } }修改Program.cs配置Host
把原来的控制台入口逻辑替换为Host托管模式,注册你的自定义服务:using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var host = Host.CreateDefaultBuilder(args) .ConfigureServices(services => { // 注册Hosted Service services.AddHostedService<CustomHostedService>(); }) .Build(); // 启动Host并等待服务停止 await host.RunAsync();测试启停效果
执行dotnet run启动项目,控制台会输出服务启动、运行的日志;按Ctrl+C触发停止,会执行你定义的停止逻辑并输出对应日志。
额外说明
dotnet new worker模板只是帮你自动完成了上述所有步骤:添加依赖、生成默认Worker类、配置Host。手动实现的方式完全等效,还能根据需求灵活调整(比如注册多个Hosted Service、自定义Host配置等),自由度更高。
内容的提问来源于stack exchange,提问作者RealDevMashup
相关产品推荐
相关产品推荐

