在软件开发过程中,有时候我们需要定时地检查数据库中的数据,并在发现新增数据时触发一个动作。为了实现这个需求,我们在 .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(); }) .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(); }) .build(); host.run(); } } }
总结
在这篇文章中,我们介绍了如何使用 .net 7 中的 periodictimer 类和 backgroundservice 类来实现一个定时检查数据库的后台服务。实际使用中会遇到更多复杂的场景,这篇文章只是一个简单的示例。