前言

在前幾篇研究快取的時候發現公司大神有在快取示範中使用了 IHostedService 這個東西,之前是選擇性跳過,這次發現接下來要做的東西會用上,還不馬上補齊。

本文

IHostedService是甚麼呢?

簡單來說就是 Core 內建的一個背景處理的介面,可以簡單的透過 BackgroundService 這個基底類別來使用它。

官方文件也提到幾點可以透過 IHostedService 簡單處理的東西:

接下來我們就來練習實作使用這個東西。

首先建立一個 Core API 的範例程式

接著就可以建立一個 HostService 並且繼承 BackgroundService ,繼承完後應該會馬上就看到提示需要實作 ExecuteAsync ,這個 ExecuteAsync 就是我們可以拿來實作排程。

 public class HostService : BackgroundService
    {
        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            throw new NotImplementedException();
        }
    }

簡單測試我們寫一個每10秒會去 D:/ 寫入 log 檔的背景程序。

    public class HostService : BackgroundService
    {
        private readonly string _filePath;

        public HostService(string filePath)
        {
            this._filePath = filePath;
        }

        /// <summary>
        /// This method is called when the <see cref="T:Microsoft.Extensions.Hosting.IHostedService" /> starts. The implementation should return a task that represents
        /// the lifetime of the long running operation(s) being performed.
        /// </summary>
        /// <param name="stoppingToken">Triggered when <see cref="M:Microsoft.Extensions.Hosting.IHostedService.StopAsync(System.Threading.CancellationToken)" /> is called.</param>
        /// <returns>
        /// A <see cref="T:System.Threading.Tasks.Task" /> that represents the long running operations.
        /// </returns>
        /// <exception cref="NotImplementedException"></exception>
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (true)
            {
                //寫入log
                await Log(content: "TestHostService");

                //每十秒執行一次
                await Task.Delay(TimeSpan.FromSeconds(value: 10));
            }
        }

        /// <summary>
        /// Logs the specified content.
        /// </summary>
        /// <param name="content">The content.</param>
        private async Task Log(string content)
        {
            using StreamWriter sw = new StreamWriter(this._filePath, append: true);
            await sw.WriteLineAsync(value: $"紀錄Log:{content}_{DateTime.Now}");
        }
    }

接著我們先到 appsettings 補上我們的 log 檔案位置。

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "LogPath": "D:/Log.txt"
}

最後到 StartUp 的 ConfigureServices 註冊我們的背景服務。

        public void ConfigureServices(IServiceCollection services)
        {
            var logPath = this.Configuration.GetValue<string>("LogPath");
            services.AddControllers();
            services.AddHostedService<HostService>(sp =>
            {
                return new HostService(logPath);
            });
        }

執行程式進行測試

接下來到 D:/log.txt 看看我們的 log 紀錄。

大致上的使用示範就是這樣,而這邊實務面上使用就如同文件所述,公司內部大神示範的是使用這個 BackgroundService 來定期檢查快取資料庫是否正常運行,若異常就可以做特殊處理,更多使用方法就留待日後慢慢探索啦。

參考連結