如何使用Asp.net Core实现定时任务,轻松解决任务调度问题!

news2024/9/21 17:45:22

一、前言

Asp.net core作为一种高效、跨平台的web框架,在开发过程中,我们常常需要在后台执行定时任务,例如清理无用文件、生成报告、发送邮件等任务。对于这种需求,我们可以使用第三方库(如Hangfire或Quartz.NET)来实现任务调度和执行,也可以使用asp.net core自带的Hosting模块和System.Timers.Timer类来实现简单的定时任务。

本篇文章主要介绍如何使用Asp.net core自带的Hosting模块和System.Timers.Timer类,以及Hangfire和Quartz.NET分别实现定时任务。将展示一个完整的示例代码,并详细解释代码中各个部分的含义和作用,以帮助理解实现过程和相关知识点。

二、自带的Hosting模块实现任务调度

下面将分步骤详细介绍如何使用asp.net core自带的Hosting模块和System.Timers.Timer类来实现定时任务。

  • 创建一个控制台应用程序

首先,在Visual Studio中创建一个控制台应用程序。

  • 添加必要的NuGet包

在项目中添加以下NuGet包:

  • Microsoft.Extensions.Hosting.Abstractions
  • Microsoft.Extensions.Hosting

这两个NuGet包提供了asp.net core的Hosting模块和应用程序生命周期管理功能。

  • 创建一个HostBuilder对象

在Main方法中创建一个HostBuilder对象:

static void Main(string[] args)
{
    var builder = new HostBuilder()
            .UseConsoleLifetime()   // 控制台生命周期管理
            .ConfigureServices((hostContext, services) =>
            {
                 // 配置服务
            });
                   
    builder.Build().Run();
}

HostBuilder提供了配置应用程序服务、托管生命周期、配置应用程序配置等功能。可以使用UseConsoleLifetime方法来配置应用程序的控制台生命周期管理。

  • 添加定时任务

在ConfigureServices方法中添加定时任务:

ConfigureServices((hostContext, services) =>
{
    // 添加定时器组件
    services.AddHostedService<MyTimer>();
});

上面的代码中,我们向服务容器中添加了一个MyTimer类,这个类实现了IHostedService接口。

  • 实现IHostedService接口

在MyTimer类中实现IHostedService接口:

// MyTimer.cs
public class MyTimer : IHostedService, IDisposable
{
    private readonly Timer _timer;
    public MyTimer()
    {
        _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); // 每5秒执行一次DoWork方法
    }
    public Task StartAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("定时任务已启动");
        return Task.CompletedTask;
    }
    public Task StopAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("定时任务已停止");
        return Task.CompletedTask;
    }
    public void Dispose()
    {
        _timer?.Dispose();
    }
    private void DoWork(object state)
    {
        Console.WriteLine($"定时任务执行中,当前时间:{DateTime.Now}");
    }
}

MyTimer类继承了IHostedService接口,该接口定义了应用程序生命周期管理的方法。在MyTimer的构造函数中,我们创建了一个计时器,并在每5秒钟的时间间隔内执行DoWork方法。在StartAsync方法中,输出“定时任务已启动”信息;在StopAsync方法中,输出“定时任务已停止”信息。Dispose方法用于释放计时器资源。

  • 运行应用程序

完成上面的步骤后,我们可以运行应用程序,观察控制台输出的结果。

每5秒钟控制台会输出一条类似于“定时任务执行中,当前时间:2023/06/12 15:34:48”的信息,表示定时任务正在运行。当我们手动停止应用程序时,控制台会输出“定时任务已停止”信息,表示定时任务已经被成功停止。

至此,我们成功地使用asp.net core自带的Hosting模块和System.Timers.Timer类实现了定时任务。在实际应用中,可以根据需求添加更多的定时任务,并调整计时器的时间间隔等参数。

三、Hangfire实现任务调度

下面将详细介绍如何使用asp.net core引入Hangfire来实现任务调度和执行。

  • 创建一个asp.net core Web应用程序

首先,在Visual Studio中创建一个asp.net core Web项目。

  • 添加必要的NuGet包

在项目中添加以下NuGet包:

  • Hangfire.AspNetCore
  • Hangfire.SqlServer

这两个NuGet包提供了Hangfire框架所需的组件和功能。

  • 配置Hangfire

在Startup.cs文件中配置Hangfire:

public void ConfigureServices(IServiceCollection services)
{
    // 配置Hangfire
    GlobalConfiguration.Configuration.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection"));
    services.AddHangfire(config => config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));
    services.AddHangfireServer();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 启用Hangfire仪表板
    app.UseHangfireDashboard();

    // ...
}

上述代码中,我们在ConfigureServices方法中配置了Hangfire,并使用AddHangfireServer方法启用了Hangfire服务。同时,我们也针对数据库进行了配置。

在Configure方法中,我们除了启用了Hangfire仪表板之外,还需要在中间件管道中注册Hangfire服务:

app.UseHangfireServer();
  • 添加定时任务

在Actions文件夹内创建ScheduledTasks类,并添加定时任务:

public class ScheduledTasks
{
    public void DoSomething()
    {
        Console.WriteLine("Hangfire: Doing something...");
    }

    public void DoSomethingElse()
    {
        Console.WriteLine("Hangfire: Doing something else...");
    }
}

在上面的代码中,我们创建了两个定时任务:DoSomething和DoSomethingElse。

  • 注册定时任务

在ConfigureServices方法中注册定时任务:

services.AddTransient<ScheduledTasks>();

// 注册定时任务
RecurringJob.AddOrUpdate<ScheduledTasks>(x => x.DoSomething(), Cron.Minutely);
RecurringJob.AddOrUpdate<ScheduledTasks>(x => x.DoSomethingElse(), Cron.Hourly);

在上面的代码中,我们使用AddOrUpdate方法来注册定时任务。第一个参数为委托表达式,指定了要执行的任务;第二个参数为Cron表达式,指定了任务的执行时间。

在上面的代码中,我们每分钟执行DoSomething任务,每小时执行DoSomethingElse任务。

  • 运行应用程序

完成上面的步骤后,我们可以运行应用程序在Hangfire仪表板中查看定时任务的执行情况。

在仪表板的"Recurring jobs"选项卡中,我们可以看到我们刚刚注册的两个定时任务以及它们的下一次执行时间。在任务执行时,我们可以在控制台输出中看到“Hangfire: Doing something…”或“Hangfire: Doing something else…”等信息,表示任务已经被成功执行。

至此,我们成功地使用asp.net core引入Hangfire来实现任务调度和执行,并注册了两个定时任务进行演示。在实际应用中,我们可以根据需求添加更多的定时任务,并根据具体业务场景进行调整和优化。

四、.net Core软件分享

Jnpf低代码是一个快速开发应用的平台,两大技术引擎Java/.Net开发,旨在提供可视化的界面设计和逻辑编排,大幅降低开发门槛。它预置大量开箱即用的功能,可以满足按需定制灵活拼装。稳定强大的集成能力,一次设计,完成多端适配。Jnpf提供了一个用户友好的开放接口,可以轻松地与各种构建工具和IDE集成。还支持插件和自定义规则,使得开发人员可以根据项目的特定需求和标准对其进行定制化配置。更多详细信息可以查看jnpf官方文档。

尝试自己搭建一个应用:https://www.jnpfsoft.com/?csdn

通过它,编码薄弱的IT人士也能自己搭建个性化的管理应用,降低技术门槛。开发者仅需少量代码或无需代码就可以开发出各类应用管理系统,由于多数采用组件和封装的接口进行开发,使得开发效率大幅提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VIOOVI:什么是精益生产改善?如何做好精益生产改善?

现代化企业经营&#xff0c;更要注重科学化管理、精准化布局&#xff0c;才能为长线稳健运营奠定基础。当下&#xff0c;精益生产改善是各行各业都在探索的话题。那什么是精益生产改善&#xff1f;精益生产&#xff0c;也被称之为精益生产方式&#xff0c;它是基于生产组织、管…

Datawhale Django后端开发入门 TASK03 QuerySet和Instance、APIVIew

一、QuerySet QuerySet 是 Django 中的一个查询集合&#xff0c;它是由 Model.objects 方法返回的&#xff0c;并且可以用于生成数据库中所有满足一定条件的对象的列表。 QuerySet 在 Django 中表示从数据库中获取的对象集合,它是一个可迭代的、类似列表的对象集合。主要特点…

重发布 路由策略

[r4]ip ip_prefix 15 permit 192.168.3.0 24. 根据序号插入规则 [r4]undo ip-prefix aa index 15. 删除规则 [r4]ip ip-prefix aa permit 192.168.3.0 24 less- equal 28 抓取目标网段为3.0掩码长度为24到28的路由 [r4]ip ip-prefix aa permit 192.168.3.0 24 greate…

记录一下基于jeecg-boot3.0的待办消息移植记录

因为之前没有记录&#xff0c;所以还要看代码进行寻找&#xff0c;比较费劲&#xff0c;所以今天记录一下&#xff1a; 1、后端 SysAnnouncementController 下面函数增加待办的几个显示内容给前端用 具体代码如下&#xff1a; /*** 功能&#xff1a;补充用户数据&#xff0c…

Google play应用成功上架要点——如何防止封号、拒审、下架?

Google Play是全球最大的移动应用商店之一&#xff0c;它是运行Android操作系统的设备的官方应用商店。它提供各种数字内容&#xff0c;包括应用程序&#xff08;应用&#xff09;、游戏、音乐、书籍等&#xff0c;包括免费和付费选项。这也为许多游戏/APP出海的企业或开发者提…

spring源码分析bean的生命周期(上)

bean扫描生成BeanDefinition的过程&#xff1a; 创建非懒加载的单例bean的过程&#xff1a; spring容器初始化好之后&#xff0c;首先要进行bean的扫描&#xff0c;然后再进行bean的创建和管理 一、扫描生成BeanDefinition public int scan(String... basePackages) {// 扫描…

[Go版]算法通关村第十关黄金——归并排序

目录 归并排序&#xff08;mergeSort&#xff09;思路分析&#xff1a;二分分割 合并两个数组 递归遍历时处理元素的过程图&#xff1a;递归遍历时栈内的数据图&#xff1a;复杂度&#xff1a;时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)、空间复杂度 O ( n ) O(n) O(n)Go…

innodb的锁

一致性锁定读和一致性非锁定读 Read Committed和Repetable Read级别下采用MVCC 实现非锁定读 但在一些情况下&#xff0c;要使用加锁来保障数据的逻辑一致性 自增列 锁的算法 唯一值 MySQL 中关于gap lock / next-key lock 的一个问题_呜呜呜啦啦啦的博客-CSDN博客 RR可以通过…

为什么一些程序员很傲慢?懂点编程了不起吗?

Perl 语言之父 Larry Wall 说过&#xff0c;好的程序员有 3 种美德&#xff1a;懒惰、急躁和傲慢&#xff08;Laziness, Impatience and hubris&#xff09;。 在日常工作中&#xff0c;程序员的傲慢可以说是被吐槽的最多的&#xff0c;之前还有人特地开了帖子&#xff0c;发…

九耶丨阁瑞钛伦特-HashCode是什么

HashCode是一种用于快速查找和比较对象的方法。它是一个整数值&#xff0c;由对象的内容计算得出。HashCode通常用于数据结构中的散列函数&#xff0c;如哈希表、散列表等。 HashCode的作用有以下几点&#xff1a; 在哈希表中快速查找对象&#xff1a;哈希表根据对象的HashCod…

SQL Server数据库无法连接

问题如下&#xff1a; 原因&#xff1a;sql server服务器未开启 解决方法&#xff1a;以管理员身份打开cmd&#xff0c;输入&#xff1a;net start mssqlserver。

[Go版]算法通关村第十二关白银——字符串经典基础面试题

目录 反转专题题目&#xff1a;反转字符串思路分析&#xff1a;左右双指针 对向交换复杂度&#xff1a;时间复杂度 O ( n ) O(n) O(n)、空间复杂度 O ( 1 ) O(1) O(1)Go代码 题目&#xff1a;反转字符串 II思路分析&#xff1a;K个一组反转思想&#xff08;找到每组的首尾索引…

实在没货,简历(软件测试)咋写?

简历咋写&#xff0c;这是很多没有【软件测试实际工作经验】的同学们非常头疼的事情。 简历咋写&#xff1f;首先你要知道简历的作用。 简历的作用是啥呢&#xff1f;一句话就是&#xff1a;让HR小姐姐约你。 如何让HR看你一眼&#xff0c;便相中你的简历&#xff0c;实现在众…

AcrelEMS-IDC数据中心综合能效管理系统解决方案-安科瑞黄安南

1 概述 安科瑞电气紧跟数据中心发展形式&#xff0c;推出AcrelEMS-IDC数据中心综合能效管理解决方案&#xff0c;包含有电力监控、动环监控、消防监控、能耗统计分析、智能照明控制以及新能源监测几个子系统。集成了变配电监测、电源备自投、电气接点测温、智能照明控制、电能…

vue 实现图片懒加载

一&#xff1a;懒加载的目的 有些页面可能展示的是大量的图片&#xff0c;如果我们一次性加载所有图片就会浪费性能&#xff0c;影响用户体验&#xff0c;所以我们就会懒加载这些图片。即可视区域之外的图片不加载&#xff0c;随着页面的滚动&#xff0c;图片进入可视区域&…

小程序swiper一个轮播显示一个半内容且实现无缝滚动

效果图&#xff1a; wxml&#xff08;无缝滚动&#xff1a;circular"true"&#xff09;&#xff1a; <!--components/tool_version/tool_version.wxml--> <view class"tool-version"><swiper class"tool-version-swiper" circul…

基于IMX6ULLmini的linux裸机开发系列二:使用C语言和SDK点亮LED

引入sdk头文件 sudo chown -R gec /opt 用这条命令给gec赋权限&#xff0c;否则访问权限不够&#xff0c;无法读取&#xff0c;如下图成功 目的&#xff1a;解决寄存器地址难查难设置 devices/MCIMX6Y2/MCIMX6Y2.h 记录外设寄存器及其相关操作 devices/MCIMX6Y2/drivers/fsl_…

分班情况通知如何下发?使用这个技术源一键搞定

在下发分班情况通知之前&#xff0c;我们需要制作好分班查询页面&#xff0c;我们先来看看利用易查分快速制作分班查询页面的教程&#xff0c;后面会分享具体的【分班情况通知范文】【分班情况通知下发方式】&#xff01; 分班查询页面制作教程 在制作分班查询系统前&#xff…

《Go 语言第一课》课程学习笔记(四)

构建模式&#xff1a;Go Module 的 6 类常规操作 为当前 module 添加一个依赖 我们如何为一个 Go Module 添加一个新的依赖包呢&#xff1f; 如果我们要为项目增加一个新依赖&#xff1a;github.com/google/uuid&#xff0c;我们首先会更新源码&#xff1a;package mainimpor…

Docker 三要素

文章目录 Docker 简介Docker客户端Docker服务器Docker 镜像Docker 容器 Docker 简介 学习完容器的相关概念&#xff0c;开始学习docker的核心组件分别是Docker客户端、Docker服务器、Docker镜像、Docker容器、仓库。 学习之前&#xff0c;我们先思考一个问题&#xff0c;目前…