- A+
所属分类:.NET技术
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 实现了一个简单的网络检测服务,并通过日志记录器记录相关信息。