在 .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<Worker> _logger;

    // 构造函数,接收一个日志记录器的实例并初始化私有字段_logger
    public Worker(ILogger<Worker> 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<Worker>();
        });

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

步骤 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<HourlyJob> 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<HourlyJob>() // 创建一个作业实例
                       .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<Worker> _logger;
    private readonly IScheduler _scheduler;

    // 构造函数,接收日志记录器和调度器实例并初始化私有字段
    public Worker(ILogger<Worker> 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 和工作服务的无缝集成,为您提供了一套用于管理后台任务的强大工具集。在探索这一增强功能时,请考虑调整调度逻辑以满足您的特定要求,例如每日、每周或自定义间隔。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谢.锋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值