首页 > 其他分享 >.net实现后台服务就这么简单,只要实现IHostedService接口就行了

.net实现后台服务就这么简单,只要实现IHostedService接口就行了

时间:2023-12-09 13:33:07浏览次数:31  
标签:NetworkStatusService 实现 网络 public using net IHostedService logger

 

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 实现了一个简单的网络检测服务,并通过日志记录器记录相关信息。

标签:NetworkStatusService,实现,网络,public,using,net,IHostedService,logger
From: https://www.cnblogs.com/hanbing81868164/p/17890845.html

相关文章

  • 常见场景题-Redis的bitmap如何实现签到功能?
    Redis的bitmap实现签到系统?答:主要讲一下Redis原生的bitmap的使用方法,以及如何使用bitmap来实现签到功能先来看一下如何使用redisbitmap的原生命令实现签到功能:签到我们先来设计key:userid:yyyyMM,那么假如usera在2023年10月3日和2023年10月4日签到的话,使用以下命令:se......
  • 动手实现基于 JSON 和 OData 两种数据模型的 Web 应用表格控件行项目的添加和删除
    文章标题描述的需求是笔者在工作和网络上经常收到的前端开发领域的咨询话题之一。Web应用的表格控件,在切换到编辑模式下之后,给用户提供了行项目的添加和删除功能。基于MVC和MVVM框架的前端控件,都离不开Model即数据模型层。笔者工作中使用最多的模型层实现技术,即JSON模型......
  • Angular 应用里异步打开对话框的技术实现
    constdialog=this.launchDialogService.openDialog();dialog.pipe(take(1)).subscribe();这段代码涉及到Angular中处理对话框(Dialog)的逻辑,其中openDialog方法返回一个Observable对象。我们将分两部分来详细解释这段代码。1.openDialog方法首先,我们来讨论openDial......
  • 简单封装PhpSpreadsheet,实现PHP快速导入、导出xlsx
    简单封装PhpSpreadsheet,实现PHP快速导入、导出xlsx<?phpnamespacexfstu\tools;usePhpOffice\PhpSpreadsheet\Spreadsheet;usePhpOffice\PhpSpreadsheet\Writer\Xlsx;usePhpOffice\PhpSpreadsheet\IOFactory;/***@methodexport(array$field,array$data)简单封......
  • k8s:通过 kubectl 插件 Kubepug 实现集群升级检查(废弃API资源检查)
    背景:k8s的版本迭代很快,虽然主要版本一直没有变化,但是次要版本一直在迭代,2022年一年就发布了三个次要版本,同时不同的次要版本之间API资源一直在变化,有新加入的,也有废弃删除的。不同版本的api资源版本也有不同,往往不是向下兼容的,比如在低版本中API资源版本为v1beta1,而高版......
  • 基于微信小程序社区老年人健康医疗信息服务平台设计与实现
    作者简介:Java、前端、Python开发多年,做过高程,项目经理,架构师主要内容:Java项目开发、Python项目开发、大学数据和AI项目开发、单片机项目设计、面试技术整理、最新技术分享收藏点赞不迷路 关注作者有好处文末获得源码 项目编号:BS-XCX-023一,环境介绍语言环境:Java: jdk1.8数据库:M......
  • 毕设选题|基于Springboot和Vue实现游戏攻略分享平台
     作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互助收藏点赞不迷路 关注......
  • 基于卷积神经网络实现高速公路表面图像裂缝检测程序
    作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互助收藏点赞不迷路 关注作......
  • VUE框架CLI组件化列表信息完整功能实现------VUE框架
    CLI组件化列表信息完整功能实现<template><div><BugHeader:bugList="bugList":saveBugCallBack="saveBugCallBack"></BugHeader><BugList:updateDescCallBack="updateDescCallBack":selectAllRollbac......
  • VUE框架CLI组件化组件的自定义事件和子组件向父组件传递数据的实现------VUE框架
    <template> <div> <!--内置函数的实现步骤--> <!--提供事件源,给事件源绑定事件,编写回调函数,将回调函数和事件进行绑定--> <!--等待事件的触发,事件触发执行回调函数--> <!--组件的自定义事件实现步骤--> <button@click="Hello()">你好</button> <!--给Us......