在 .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 和工作服务的无缝集成,为您提供了一套用于管理后台任务的强大工具集。在探索这一增强功能时,请考虑调整调度逻辑以满足您的特定要求,例如每日、每周或自定义间隔。

相关推荐
鸠摩智首席音效师2 小时前
.NET Core 应用程序如何在 Linux 中创建 Systemd 服务 ?
linux·运维·.netcore
丨我是张先生丨6 小时前
Windows VSCode .NET CORE WebAPI Debug配置
.netcore
MoFe17 小时前
【.net core】【sqlsugar】字符串拼接+内容去重
java·开发语言·.netcore
慧都小妮子7 小时前
深入探讨 .NET Core 3.0 浮点计算差异与解决方案
.netcore·stimulsoft·.net core 3.0
眸笑丶7 小时前
.Net Core根据文件名称自动注入服务
.netcore
c_s_l_267 小时前
.net core开发windows程序在国产麒麟操作系统中运行
.netcore
咩咩觉主1 天前
尽量通俗易懂地概述.Net && U nity跨语言/跨平台相关知识
unity·c#·.net·.netcore
NetX行者3 天前
.NET 9震撼来袭:基于.NET 8的五大功能亮点,引领开发新潮流
开发语言·microsoft·c#·.netcore
小吴同学·3 天前
(实战)WebApi第13讲:怎么把不同表里的东西,包括同一个表里面不同的列设置成不同的实体,所有的给整合到一起?【前端+后端】、前端中点击标签后在界面中显示
c#·.netcore·.net core