• 在 .NET Core 中构建工作服务和调度运行


    介绍

    .NET Core 中的工作服务已成为构建持续运行并执行各种任务的后台服务的强大机制。本文提供了有关创建工作服务的分步指南,深入研究了其演变过程,并阐明了代码片段以及执行过程。

    工人服务的演变

    工作服务是 .NET Core 旅程的延续,它源于高效运行后台任务的需求。它们继承了托管服务和控制台应用程序的概念,为需要持续执行的场景(例如数据处理、消息队列使用或计划任务)提供了强大的解决方案。

    步骤 1.创建 Worker 服务

    首先使用 .NET CLI 创建一个新的工作服务项目

    dotnet new worker -n MyWorkerService
    

    此命令生成工作者服务的基本结构。

    第 2 步:定义 Worker 逻辑

    导航到生成的Worker.cs文件。在这里,您可以定义工作服务将持续执行的逻辑。例如:

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    
    public class Worker : BackgroundService
    {
        private readonly ILogger _logger;
    
        // 构造函数,接收一个日志记录器的实例并初始化私有字段_logger
        public Worker(ILogger logger)
        {
            _logger = logger;
        }
    
        // 重写的ExecuteAsync方法,这是后台服务执行的主要逻辑
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            // 当没有请求取消操作时循环执行
            while (!stoppingToken.IsCancellationRequested)
            {
                // 记录信息日志,显示当前运行时间
                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                // 等待1秒钟,并检查取消令牌,以便在取消请求时终止等待
                await Task.Delay(1000, stoppingToken);
            }
        }
    }
    

    在此示例中,工作器每秒记录一条消息。您可以根据具体要求替换此逻辑。

    步骤 3.配置并运行 Worker

    导航到文件并在方法Program.cs内配置工作服务CreateHostBuilder

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService();
            });
    

    此配置注册了要由主机管理的工作服务。

    步骤 4.运行 Worker 服务

    使用以下命令构建并运行工作服务

    dotnet build
    dotnet run
    

    工作服务将开始运行,您将看到按照指定的间隔生成的日志消息。

    步骤5.执行过程

    工作服务中的方法ExecuteAsync是持续执行过程的入口点。它会一直运行,直到取消标记发出关闭请求信号。这Task.Delay可确保迭代之间的指定延迟。

    安排运行

    了解如何在特定间隔或时间安排任务可增强工作服务的多功能性。按照此分步指南将调度纳入 .NET Core 工作服务。

    安装所需的软件包

    要启用调度,您需要该Quartz库。使用以下命令安装它

    dotnet add package Quartz
    

    定义计划作业

    为要安排的作业创建一个类。例如,每小时运行一次的作业
    public class HourlyJob : IJob
    {
    private readonly ILogger _logger;

    // 构造函数,接收一个日志记录器的实例并初始化私有字段_logger
    public HourlyJob(ILogger logger)
    {
        _logger = logger;
    }
    
    // Execute方法,这是作业执行的主要逻辑
    public async Task Execute(IJobExecutionContext context)
    {
        // 记录信息日志,显示当前执行时间
        _logger.LogInformation("Hourly job executed at: {time}", DateTimeOffset.Now);
    }
    

    }

    配置 Quartz

    在ConfigureServices方法中Startup.cs,配置Quartz使用JobScheduler.

      services.AddSingleton(provider =>
    {
        var schedulerFactory = new StdSchedulerFactory(); // 创建调度器工厂
        var scheduler = schedulerFactory.GetScheduler().Result; // 获取调度器实例
    
        scheduler.Start(); // 启动调度器
    
        var job = JobBuilder.Create() // 创建一个作业实例
                           .Build();
    
        var trigger = TriggerBuilder.Create() // 创建一个触发器实例
                                   .WithIdentity("hourlyTrigger", "default") // 设置触发器的身份标识
                                   .StartNow() // 立即开始
                                   .WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever()) // 设置触发器的调度计划,每小时执行一次,永远重复
                                   .Build();
    
        scheduler.ScheduleJob(job, trigger); // 调度作业与触发器
    
        return scheduler; // 返回调度器实例
    });
    

    此配置设置了一个HourlyJob每小时运行一次的作业()。

    修改 Worker 服务

    更新Worker.cs以注入 Quartz 调度程序并处理其生命周期。

    public class Worker : BackgroundService
    {
        private readonly ILogger _logger;
        private readonly IScheduler _scheduler;
    
        // 构造函数,接收日志记录器和调度器实例并初始化私有字段
        public Worker(ILogger logger, IScheduler scheduler)
        {
            _logger = logger;
            _scheduler = scheduler;
        }
    
        // 重写的ExecuteAsync方法,这是后台服务执行的主要逻辑
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested) // 当没有请求取消操作时循环执行
            {
                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); // 记录信息日志,显示当前运行时间
                await Task.Delay(1000, stoppingToken); // 等待1秒钟,并检查取消令牌,以便在取消请求时终止等待
            }
        }
    
        // 重写的StopAsync方法,当服务停止时执行
        public override async Task StopAsync(CancellationToken cancellationToken)
        {
            await _scheduler.Shutdown(); // 关闭调度器
            await base.StopAsync(cancellationToken); // 调用基类的StopAsync方法
        }
    }
    

    运行应用程序

    使用以下命令构建并运行应用程序。

    dotnet build
    dotnet run
    

    现在,您将看到工作服务每秒记录一次,并且每小时按照指定的间隔执行一次作业。

    结论

    在 .NET Core 中创建工作服务是一个简单的过程,它为后台任务执行提供了多功能解决方案。从托管服务和控制台应用程序的演变产生了一个与更广泛的 .NET 生态系统无缝集成的框架。通过遵循本分步指南,您可以构建和运行工作服务,在 .NET Core 的后台任务管理领域获得实践经验。

    通过使用 Quartz 将调度集成到 .NET Core 工作服务中,您可以扩展其功能以包括频繁运行,例如每小时任务。本分步指南演示了 Quartz 和工作服务的无缝集成,为您提供了一套用于管理后台任务的强大工具集。在探索这一增强功能时,请考虑调整调度逻辑以满足您的特定要求,例如每日、每周或自定义间隔。

  • 相关阅读:
    LeetCode笔记:Weekly Contest 306
    Unicode strings
    MySQL主从复制
    数据结构入门4-1(串、数组)
    计算机竞赛 目标检测-行人车辆检测流量计数
    Linux用户管理— 用户组管理命令
    强制解决Java参数乱码问题
    IDEA 使用技巧(快速生成list)
    【C++基础】内存泄漏检测——Valgrind、VLD、RTC
    SQL SERVER Inregration Services-OLE DB、Oracle和ODBC操作
  • 原文地址:https://blog.csdn.net/xiefeng240601/article/details/139563235