在軟件開發過程中,有時候我們需要定時地檢查數據庫中的數據,並在發現新增數據時觸發一個動作。爲了實現這個需求,我們在 .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