.NET Core 3.1 Worker Service如何实现Windows Service的OnPause/OnContinue方法
解决方案
.NET Core 3.1 环境下可以通过 Windows 服务生命周期扩展 + 线程信号控制的组合方案实现 OnPause/OnContinue 功能,不需要修改 BackgroundService 的核心逻辑,具体实现步骤如下:
- 第一步:安装 NuGet 包
Microsoft.Extensions.Hosting.WindowsServices,该包原生提供了 Windows 服务的全生命周期事件支持。 - 第二步:自定义继承自
BackgroundService的工作类,内部通过手动重置信号量控制业务逻辑的暂停和继续,代码示例:
public class CustomWorker : BackgroundService { // 初始为有信号状态,代表服务正常运行 private readonly ManualResetEventSlim _pauseSignal = new ManualResetEventSlim(true); private bool _isStopping = false; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!_isStopping && !stoppingToken.IsCancellationRequested) { // 等待信号量放行,收到停止指令时会直接抛出异常退出循环 _pauseSignal.Wait(stoppingToken); // 此处写入你的业务逻辑 await RunBusinessLogic(stoppingToken); await Task.Delay(1000, stoppingToken); } } // 供外部触发的暂停方法 public void Pause() { _pauseSignal.Reset(); } // 供外部触发的继续方法 public void Continue() { _pauseSignal.Set(); } public override async Task StopAsync(CancellationToken cancellationToken) { _isStopping = true; // 停止前先唤醒阻塞的线程,避免服务退出超时 _pauseSignal.Set(); await base.StopAsync(cancellationToken); } private async Task RunBusinessLogic(CancellationToken stoppingToken) { // 你的实际业务实现 } }
- 第三步:在 Program.cs 中注册 Windows 服务的暂停、继续事件回调,代码示例:
public class Program { public static void Main(string[] args) { var host = CreateHostBuilder(args).Build(); // 取Windows服务生命周期实例,绑定事件 var serviceLifetime = host.Services.GetRequiredService<IHostLifetime>() as WindowsServiceLifetime; if (serviceLifetime != null) { // 声明服务支持暂停/继续 serviceLifetime.CanPauseAndContinue = true; // 绑定暂停事件 serviceLifetime.Pausing += () => { var worker = host.Services.GetRequiredService<CustomWorker>(); worker.Pause(); }; // 绑定继续事件 serviceLifetime.Continuing += () => { var worker = host.Services.GetRequiredService<CustomWorker>(); worker.Continue(); }; } host.Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices(services => { // 注册自定义Worker服务 services.AddHostedService<CustomWorker>(); }) // 启用Windows服务运行支持 .UseWindowsService(); }
注意:默认
AddHostedService注册的服务为单例模式,符合事件绑定的生命周期要求。如果你的业务逻辑包含长耗时任务,建议在暂停逻辑中添加状态快照处理,避免暂停后出现数据不一致问题。
内容的提问来源于stack exchange,提问作者Mhd
相关产品推荐
相关产品推荐

