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