当前位置: 首页 > news >正文

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

相关文章:

  • Java 关于抽象 -- Java 语言的抽象类、接口和函数式接口
  • STM32项目分享:智能蓝牙手环
  • 攻防世界--杂项misc-2017_Dating_in_Singapore
  • 力扣爆刷第149天之TOP100五连刷(LRU、K个一组)
  • 专栏【汇总】
  • Ansible——shell模块
  • 面试题:如何避免索引失效?
  • LCD电子广告牌课程设计
  • R语言绘图 --- 桑基图(Biorplot 开发日志 --- 5)
  • Win10下CodeBlock实现socket TCP server/client
  • CSS--超出就显示滚动条并设置滚动条的样式
  • LeetCode 每日一题 2024/6/3-2024/6/9
  • Qt——窗口
  • RabbitMQ从入门到入土
  • 什么是校园抄表系统?
  • 【知识碎片】第三方登录弹窗效果
  • ES6之路之模块详解
  • Java Agent 学习笔记
  • JavaScript 基本功--面试宝典
  • JavaScript中的对象个人分享
  • Java的Interrupt与线程中断
  • JS变量作用域
  • js学习笔记
  • Linux各目录及每个目录的详细介绍
  • nodejs:开发并发布一个nodejs包
  • Python连接Oracle
  • RxJS: 简单入门
  • Vue 重置组件到初始状态
  • Vue2 SSR 的优化之旅
  • webgl (原生)基础入门指南【一】
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 当SetTimeout遇到了字符串
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 规范化安全开发 KOA 手脚架
  • 解析带emoji和链接的聊天系统消息
  • 离散点最小(凸)包围边界查找
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 微信支付JSAPI,实测!终极方案
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #宝哥教你#查看jquery绑定的事件函数
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (003)SlickEdit Unity的补全
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (原創) 未来三学期想要修的课 (日記)
  • (杂交版)植物大战僵尸
  • (转) Android中ViewStub组件使用
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • *** 2003
  • .aanva
  • .gitignore文件忽略的内容不生效问题解决
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net core控制台应用程序初识