在软件开发过程中,有时候我们需要定时地检查数据库中的数据,并在发现新增数据时触发一个动作。为了实现这个需求,我们在 .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

最新文章

  1. Oracle数据加载之sqlldr工具的介绍
  2. java文件上传路径缺少\的解决办法
  3. 黄聪:优化清理WordPress数据库wp_options表(缩小autoload体积)
  4. testNG参数传递方式
  5. GWT中实现跳转及不同entrypoint怎么互相访问
  6. linux下切割catalina.out文件,按天生成文件
  7. hibernate中有时候复杂删除有时候可以拆分为两个语句
  8. 公司项目笔记-导出excel
  9. ora-01031:insufficient privileges 解决方案
  10. 世界上速度最快的输入法 Fleksy 为了支持中国
  11. JAVA基础--toString, equals方法
  12. 自己动手搭建一个简易的SpringBoot环境
  13. NEO从入门到开窗(1) - 一个智能合约的诞生
  14. Android实战之ListView复选框
  15. golang高性能RPC:Apache Thrift安装使用完全攻略
  16. 生成对抗网络(GAN)
  17. springboot+websocket 归纳收集
  18. jQuery UI练习
  19. 《剑指offer》第六十八题(树中两个结点的最低公共祖先)
  20. 2Q - Fibbonacci Number

热门文章

  1. MySql的InnoDB的三层B+树可以存储两千万左右条数据的计算逻辑
  2. 实验02_Proteus仿真数码管显示报告
  3. 云原生强大且灵活的持续集成CI开源框架Tekton实战-上
  4. CentOS 7.9 安装 rabbitmq-3.10.2
  5. HTML+CSS基础知识(2)选择器的使用、盒子模型的讲解、列表的使用
  6. MVVM视图模型
  7. python制作一个小型翻译软件
  8. element-ui v-table 复选框默认选中
  9. 题解 CF327A Flipping Game
  10. 十二、Pod的NameSpace