IHostedService 介面在.NET Core中的主要用途是定義應用程式生命周期內運行的後臺服務。這些服務可以執行初始化、長時間運行的任務、定期運行的任務等。通過實例,我們可以演示如何使用 IHostedService 來實現一個簡單的網路檢測服務,並記錄日誌。 首先,我們需要創建一個實現 ...
IHostedService 介面在.NET Core中的主要用途是定義應用程式生命周期內運行的後臺服務。這些服務可以執行初始化、長時間運行的任務、定期運行的任務等。通過實例,我們可以演示如何使用 IHostedService 來實現一個簡單的網路檢測服務,並記錄日誌。
首先,我們需要創建一個實現 IHostedService 介面的類。在這個類中,我們將使用 HttpClient 定期檢測網路是否正常,並通過 ILogger 記錄日誌。
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
public class NetworkStatusService : IHostedService, IDisposable
{
private readonly ILogger<NetworkStatusService> _logger;
private readonly HttpClient _httpClient;
private Timer _timer;
public NetworkStatusService(ILogger<NetworkStatusService> logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_httpClient = new HttpClient();
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("NetworkStatusService 正在啟動.");
// 使用 Timer 定期執行網路檢測任務
_timer = new Timer(CheckNetworkStatus, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
return Task.CompletedTask;
}
private async void CheckNetworkStatus(object state)
{
try
{
// 這裡可以替換成實際的網路檢測邏輯
var response = await _httpClient.GetAsync("https://www.example.com");
if (response.IsSuccessStatusCode)
{
_logger.LogInformation("網路正常.");
}
else
{
_logger.LogWarning("網路異常. HTTP 狀態碼: {StatusCode}", (int)response.StatusCode);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "網路檢測時發生錯誤.");
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("NetworkStatusService 正在停止.");
// 在這裡執行清理邏輯,停止長時間運行的任務
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
// 釋放資源
_httpClient.Dispose();
_timer?.Dispose();
}
}
接下來,我們需要在 Startup.cs 文件中註冊這個服務:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// 註冊 NetworkStatusService
services.AddHostedService<NetworkStatusService>();
}
}
這個示例中,NetworkStatusService 類會在應用程式啟動時開始執行網路檢測任務,每隔30秒執行一次。如果網路正常,將會記錄信息級別的日誌,如果網路異常,則記錄警告級別的日誌。這樣,我們就使用 IHostedService 實現了一個簡單的網路檢測服務,並通過日誌記錄器記錄相關信息。