網站首頁 編程語言 正文
在軟件開發過程中,有時候我們需要定時地檢查數據庫中的數據,并在發現新增數據時觸發一個動作。為了實現這個需求,我們在 .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 類來實現一個定時檢查數據庫的后臺服務。實際使用中會遇到更多復雜的場景,這篇文章只是一個簡單的示例。
原文鏈接:https://www.cnblogs.com/newbe36524/p/16989678.html
相關推薦
- 2022-04-25 ASP.NET?Core?MVC中使用Tag?Helper組件_實用技巧
- 2022-08-17 Python?獲取今天任意時刻的時間戳的方法_python
- 2022-11-22 在?React?項目中全量使用?Hooks的方法_React
- 2023-03-27 React里的Fragment標簽的具體使用_React
- 2022-04-25 一篇文章帶你了解C語言的文件操作_C 語言
- 2022-07-21 數據庫表數據操作-新增、刪除、修改
- 2022-08-15 springboot切換為redis緩存
- 2023-01-05 Kotlin?掛起函數CPS轉換原理解析_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支