.Net 6.0 监听Windows网络状态切换

上次发了一个文章获取windows网络状态,判断是否可以访问互联网。传送门:获取本机网络状态

这次我们监听网络状态切换,具体代码如下:

cs 复制代码
public class WindowsNetworkHelper
{
    private static Action<bool>? _NetworkStatusChangedCallback;

    /// <summary>
    /// 检查当前网络是否可访问互联网、并设置网络状态变更回调
    /// </summary>
    /// <param name="networkStatusChangedCallback"></param>
    /// <returns>true-可访问互联网;false-不可访问互联网</returns>
    public static bool CheckInternetAccessAndSetNetworkStatusChangedCallback(Action<bool> networkStatusChangedCallback)
    {
        //幅值
        _NetworkStatusChangedCallback = networkStatusChangedCallback;
        //注册网络状态变更事件
        NetworkInformation.NetworkStatusChanged -= NetworkInformation_NetworkStatusChanged;
        NetworkInformation.NetworkStatusChanged += NetworkInformation_NetworkStatusChanged;
        //返回当前网络状态
        return CheckInternetAccess();
    }

    private static void NetworkInformation_NetworkStatusChanged(object sender)
    {
        //网络状态变化,获取一次当前网络状态
        var bInternetAccess = CheckInternetAccess();
        //触发回调,把网络状态作为参数传入
        _NetworkStatusChangedCallback?.Invoke(bInternetAccess);
    }

    public static bool CheckInternetAccess()
    {
        var connectProfile = NetworkInformation.GetInternetConnectionProfile();
        if (null == connectProfile) return false;
        var networkLevel = connectProfile.GetNetworkConnectivityLevel();
        if (networkLevel == NetworkConnectivityLevel.InternetAccess)
            return true;
        else
            return false;
    }
}

调用方式:

cs 复制代码
using System;
using System.Diagnostics;
using System.Management;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using Windows.Networking.Connectivity;

namespace ConsoleApp3
{
    internal class Program
    {
        private static void Main(string[] args)
        {

            var ret = WindowsNetworkHelper.CheckInternetAccessAndSetNetworkStatusChangedCallback(NewtworkStatusChanged);
            Console.WriteLine($"宜家网络状态是否可访问互联网:{ret}");
            Console.ReadLine();
        }

        private static void NewtworkStatusChanged(bool sender)
        {
            Console.WriteLine($"当前是否可访问互联网:{sender},是否后台线程={Thread.CurrentThread.IsBackground}");
        }
    }
}

从联网到断开网络、再连上的效果:

相关推荐
jjocwc6 分钟前
什么是.net(dotnet)
.net
friklogff8 分钟前
【C#生态园】一文详解:NHibernate、Entity Framework Core、Dapper 等 .NET ORM 框架优劣对比
开发语言·c#·.net
威迪斯特28 分钟前
如何快速建立自己的异地互联的远程视频监控系统,通过web浏览器可以直接查看公网上的监控视频(上)
运维·服务器·网络·视频监控·公有云·监控视频·统一接入
SONGW20181 小时前
kubeadm部署k8s集群,版本1.23.6;并设置calico网络BGP模式通信,版本v3.25--未完待续
网络·容器·kubernetes
深夜吞食2 小时前
Linux网络基础:HTTPS 网络传输协议
linux·服务器·网络·https
汪子熙2 小时前
什么是 HTTP 请求的 X-Forwarded-Proto 字段
网络·网络协议·http
大神的风范2 小时前
VGG16网络介绍及代码撰写详解(总结1)
网络
网安康sir2 小时前
2024年三个月自学网络安全(黑客技术)教程。
开发语言·网络·安全·web安全·php
23zhgjx-zgx2 小时前
以太网交换安全:端口安全
服务器·网络·华为·hcip·ensp
向你扔鸡爪2 小时前
Visual Studio-X64汇编编写
汇编·windows·visual studio