You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:24:03