實現 .Net 7 下的資料庫定時檢查

2022-12-20 12:05:14

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