实现 .Net 7 下的数据库定时检查
在软件开发过程中,有时候我们需要定时地检查数据库中的数据,并在发现新增数据时触发一个动作。为了实现这个需求,我们在 .Net 7 下进行一次简单的演示。
PeriodicTimer
.Net 6 中新增了 PeriodicTimer 这个类,它可以用来创建一个定时器,以固定间隔的时间调用回调函数。使用方法如下:
using var timer = new PeriodicTimer(TimeSpan.FromSeconds(10));
while (await timer.WaitForNextTickAsync())
{
//Business logic
}
这样就可以每隔 10 秒执行一次操作。
PeriodicTimer 相比于传统 Timer 的优势在于:
- PeriodicTimer 将使我们能够异步地等待指定的时间间隔。
- 在回调的执行过程中,我们可以阻止下一次回调的执行,直到我们完成了当前的操作。
BackgroundService
AspNetCore 中的 BackgroundService 类,它是一个抽象类,实现了 IHostService 接口,可以被用来创建后台服务。使用方法如下:
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
namespace ConsoleApp1
{
public class DatabaseCheckService : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
Console.WriteLine("Checking database...");
// 检查数据库代码
await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);
}
}
}
class Program
{
static void Main(string[] args)
{
var host = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<DatabaseCheckService>();
})
.Build();
host.Run();
}
}
}
在这个例子中,我们继承了 BackgroundService 类并重写了 ExecuteAsync 方法。ExecuteAsync 方法会在后台服务启动时被调用,并在参数 stoppingToken 被取消时退出。我们在 while 循环中使用 Task.Delay 方法来等待 5 秒,并在每次循环中调用检查数据库的代码。
结合使用
我们可以将 PeriodicTimer 和 BackgroundService 结合起来,实现一个定时检查数据库的后台服务。代码如下:
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace ConsoleApp1
{
public class DatabaseCheckService : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
using var timer = new PeriodicTimer(TimeSpan.FromSeconds(10));
while (!stoppingToken.IsCancellationRequested)
{
if (await timer.WaitForNextTickAsync(stoppingToken))
{
Console.WriteLine("Checking database...");
// 检查数据库代码
}
}
}
}
class Program
{
static void Main(string[] args)
{
var host = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<DatabaseCheckService>();
})
.Build();
host.Run();
}
}
}
总结
在这篇文章中,我们介绍了如何使用 .Net 7 中的 PeriodicTimer 类和 BackgroundService 类来实现一个定时检查数据库的后台服务。实际使用中会遇到更多复杂的场景,这篇文章只是一个简单的示例。
参考链接
- PeriodicTimer[1]
- Hosted Services in ASP.NET Core[2]
本文采用 Chat OpenAI 辅助注水浇筑而成,如有雷同,完全有可能。
- 本文作者: newbe36524
- 本文链接: https://www.newbe.pro/ChatAI/How-to-create-a-timer-host-service/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
参考资料
[1]
PeriodicTimer: https://learn.microsoft.com/dotnet/api/system.threading.periodictimer?view=net-7.0&WT.mc_id=DX-MVP-5003606
[2]
Hosted Services in ASP.NET Core: https://learn.microsoft.com/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-6.0&WT.mc_id=DX-MVP-5003606
实现 .Net 7 下的数据库定时检查的更多相关文章
- windows下mysql数据库定时备份。
注意:看本教程先必须会windows自带的"任务计划程序". 首先创建一个bat后缀的文件我的是timerExecutePhp.bat文件 timerExecutePhp.bat ...
- 32. linux下oracle数据库定时备份
这里以oradatabak.sh(里面的内容要根据实际修改)脚本放在/u01/11g/datapump下为例: #1.添加脚本执行权限 chmod +x /u01/11g/datapump/orada ...
- windows下oracle数据库定时备份与压缩批处理脚本(win7/win2008亲测通过)
第一种方式:全备份,并直接覆盖原来的备份文件,固定命名. 脚本: @echo off exp system/a123@HZPG file=e:\db_backup\oradata.dmp log=e: ...
- linux下使用crontab定时备份MYSQL数据库的方法:
摘要 linux下使用crontab定时备份MYSQL数据库的方法: 只需按照下面3步做,一切都在你的掌控之下: 第一步:在服务器上配置备份目录代码: ------------------------ ...
- Linux下MySQL数据库的备份与恢复
Linux下MySQL数据库的备份与恢复 作者:Grey 原文地址: Github 语雀 博客园 基于版本 MySQL5.7 Deepin Linux 15.11 xtrabackup-2.4.18 ...
- SQL Server数据库定时自动备份
SQL Server 数据库定时自动备份[转] 在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求 ...
- linux下crontab实现定时服务详解
http://www.jb51.net/LINUXjishu/151805.html 任务调度的crond常驻命令 crond 是linux用来定期执行程序的命令.当安装完成操作系统之后,默认便会启动 ...
- SQL Server 数据库定时自动备份
原文:SQL Server 数据库定时自动备份 SQL Server 数据库定时自动备份——每天定时备份,保留前8天的备份 利用SQL Server代理新建作业来定期备份 1)在数据库库的[SQL S ...
- Linux下链接数据库图形化工具
(一).Linux环境下mysql的安装.SQL操作 Linux下安装MySQL (rmp --help) 基本步骤:上传软件->检查当前Linux环境是否已经安装,如发现系统自带的,先卸载-& ...
- Linux下Oracle数据库的安装
记录详细过程以备使用 一.准备安装 为了确保Oracle数据库11g能够成功安装,您需要做好准备工作,例如检查网络配置.更改Linux内核参数.创建用户Oracle.创建安装目录.设置用户Oracle ...
随机推荐
- Java泛型的总结
泛型可以用于接口.类.方法上.还有泛型通配符这个概念 泛型的好处:可以在编译时检查 1.用于方法中,指定该方法中的形参的类型. 语法:修饰符 <代表泛型的变量> 返回值类型 方法名(参数) ...
- 云原生虚拟网络 tun/tap & veth-pair
云原生虚拟网络 tun/tap & veth-pair 转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/684 ...
- postman7种断言的使用
导航:1.postman断言介绍2.状态码断言3.响应正文断言-包含4.响应正文断言-json字段5.响应头断言6.响应时间断言7.环境变量的断言 - - - - - - - - - 分割线 - - ...
- 文件管理工具“三剑客” #Everything #SpaceSniffer #Clover
前言: 本文收集了我日常使用的三个文件管理工具: 文件搜索神器--Everything 磁盘文件占用分析工具--SpaceSniffer 文件资源管理器--Clover 下面我从工具解决的痛点和使用技 ...
- 通过linux-PAM实现禁止root用户登陆的方法
前言 在linux系统中,root账户是有全部管理权限的,一旦root账户密码外泄,对于服务器而言将是致命的威胁:出于安全考虑,通常会限制root账户的登陆,改为配置普通用户登陆服务器后su切换到ro ...
- Docker | 制作tomcat镜像并部署项目
本文讲解如何制作自己的tomcat镜像,并使用tomcat部署项目 原料准备: tomcat.jdk安装包,dockerfile文件 步骤 1.准备压缩包 jdk-8u301-linux-x64.ta ...
- 利用Hutool-(Java工具类)实现验证码校验
目录 Hutool工具类介绍 Hutool实现验证码生成 测试验证码生成 其他样式的验证码 第一篇是纯利用现有JDK提供的绘图类(ImageIO)类制作,这个过程比较复杂且需要了解ImageIO类. ...
- 一篇文章让你搞懂Java中的静态代理和动态代理
什么是代理模式 代理模式是常用的java设计模式,在Java中我们通常会通过new一个对象再调用其对应的方法来访问我们需要的服务.代理模式则是通过创建代理类(proxy)的方式间接地来访问我们需要的服 ...
- java中的栈(利用数组实现栈)
java中的栈(利用数组实现栈) 常见的数据结构:https://blog.csdn.net/weixin_43304253/article/details/119764275 栈的介绍 1.栈的英文 ...
- XAF新手入门 - 模块(Module)
模块概述 谈到模块大家应该都不会感到陌生,不管是前端还是后端都有模块的概念,XAF中的模块概念与大多数框架中的模块概念是相通的.XAF模块首先是一个.NET类库,同时它还包含一个继承自ModuleBa ...