我知道我不是第一个问这个问题的人:我如何知道我的申请是否在线? 我找到了这篇文章:StackOverflow . 我想用 C# 和 .NET 3.5 来完成。
建议定期对资源执行 ping 操作。我对这个建议不是很满意。我宁愿检测网络变化,然后 ping 我的服务以检查它是否在线。
.NET 为此提供了两个事件: NetworkChange.NetworkAvailabilityChanged NetworkChange.NetworkAddressChanged
第一个事件听起来不错,但只有在最后一个在线的网卡离线时才会触发。我有几个由 VMWare 安装的虚拟网卡,它们始终在线。 第二个事件有效,但在插入网络电缆和事件之间,通常有 5 秒的等待时间。 当我拔下电缆时,Windows 托盘图标或多或少会立即使用react。 与此托盘图标一样快的最佳方法是什么?
我的解决方法是轮询 网络接口(interface).GetAllNetworkInterfaces() 每 500 毫秒并抛出我自己的事件以防网络适配器的状态发生变化。
必须有更好的解决方案:)
最佳答案
我尝试了 Webleeuw 建议的链接,但该代码还需要 4 到 10 秒才能在我插入或拔下电缆时通知我。 现在,我想知道它是否只是我的计算机或安装,我编写了自己的基于 NetworkInterface.GetAllNetworkInterfaces() 的 Observer 类。
而且:它以闪电般的速度工作。我的应用程序现在的 react 与托盘一样快。 该代码远非生产代码,它只是一个快速破解。但这是我现在要建立的:)
using System;
using System.Net.NetworkInformation;
using Timer=System.Threading.Timer;
namespace NetworkCheckApp
{
public class NetworkStatusObserver
{
public event EventHandler<EventArgs> NetworkChanged;
private NetworkInterface[] oldInterfaces;
private Timer timer;
public void Start()
{
timer = new Timer(UpdateNetworkStatus, null, new TimeSpan(0, 0, 0, 0, 500), new TimeSpan(0, 0, 0, 0, 500));
oldInterfaces = NetworkInterface.GetAllNetworkInterfaces();
}
private void UpdateNetworkStatus(object o)
{
var newInterfaces = NetworkInterface.GetAllNetworkInterfaces();
bool hasChanges = false;
if (newInterfaces.Length != oldInterfaces.Length)
{
hasChanges = true;
}
if (!hasChanges)
{
for (int i = 0; i < oldInterfaces.Length; i++)
{
if (oldInterfaces[i].Name != newInterfaces[i].Name || oldInterfaces[i].OperationalStatus != newInterfaces[i].OperationalStatus)
{
hasChanges = true;
break;
}
}
}
oldInterfaces = newInterfaces;
if (hasChanges)
{
RaiseNetworkChanged();
}
}
private void RaiseNetworkChanged()
{
if (NetworkChanged != null)
{
NetworkChanged.Invoke(this, null);
}
}
}
}
关于c# - 确定互联网连接是否可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1859799/