.NET中是否存在可感知主机网络连接状态变化的观察者组件?
.NET中的网络连接状态监听方案
当然有啦!在.NET生态里,有几种原生的方案可以帮你监听网络连接的建立与断开状态,不用额外找第三方组件。下面我给你详细拆解下:
1. 最直接的原生事件:NetworkChange类
不管是.NET Framework还是较新的.NET Core/.NET 5+,都自带了System.Net.NetworkInformation.NetworkChange类,专门用来监听网络状态变化。它提供了两个核心事件:
NetworkAvailabilityChanged:当系统的网络可用性整体变化时触发(比如从无网到有网,或者反过来)NetworkAddressChanged:当网络接口的地址发生变化时触发(比如IP地址更新,通常也伴随连接状态变化)
给你个快速上手的代码示例:
using System; using System.Net.NetworkInformation; class NetworkMonitor { static void Main() { // 注册监听事件 NetworkChange.NetworkAvailabilityChanged += OnNetworkAvailabilityChanged; NetworkChange.NetworkAddressChanged += OnNetworkAddressChanged; Console.WriteLine("正在监听网络状态变化,按任意键退出..."); Console.ReadKey(); } private static void OnNetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e) { if (e.IsAvailable) { Console.WriteLine("✅ 互联网连接已建立"); } else { Console.WriteLine("❌ 互联网连接已断开"); } } private static void OnNetworkAddressChanged(object sender, EventArgs e) { Console.WriteLine("🔄 网络地址发生变化,建议检查连接状态"); } }
注意事项
不过要提醒你:NetworkAvailabilityChanged只是判断系统是否有可用的网络接口,不一定代表真的能访问互联网(比如接口连上了路由器但路由器没联网)。如果需要精准判断是否能访问外网,可以在事件触发后做个轻量验证。
2. 补充:精准验证互联网连通性
如果需要确认设备真的能访问互联网,可以在事件回调里加个简单的检测逻辑,比如请求一个可靠的测试地址:
private static bool IsActuallyConnectedToInternet() { try { // 微软的连通性测试地址,返回简单文本 using var httpClient = new System.Net.Http.HttpClient { Timeout = TimeSpan.FromSeconds(5) }; var response = httpClient.GetAsync("http://www.msftconnecttest.com/connecttest.txt").Result; return response.IsSuccessStatusCode; } catch (Exception) { return false; } }
你可以把这个方法加到OnNetworkAvailabilityChanged里,比如当e.IsAvailable为true时,再调用这个方法做二次确认,这样结果会更准确。
3. 针对.NET Core/.NET 5+的额外说明
在较新的.NET版本里,除了NetworkChange,你也可以通过NetworkInterface.GetAllNetworkInterfaces()定期扫描网络接口状态,但这种轮询方式效率不如事件驱动,所以更推荐用NetworkChange的事件监听方案。
总结一下:这些都是.NET原生支持的方案,足够满足你监听网络连接状态变化的需求,不需要额外引入第三方库。
内容的提问来源于stack exchange,提问作者RoK
相关产品推荐
相关产品推荐

