13 .net c# networking
我知道我不是第一个提出这个问题的人:我如何知道我的申请是否在线?我发现这篇文章:StackOverflow.我想用C#和.NET 3.5来做.
建议定期ping资源.我对这个建议不太满意.我宁愿检测网络更改,然后ping我的服务以检查它是否在线.
.NET为此提供了两个事件:NetworkChange.NetworkAvailabilityChanged NetworkChange.NetworkAddressChanged
第一个事件听起来不错,但只有当最后一个在线网卡脱机时才会触发.我有几个虚拟网卡已经由VMWare安装,并且总是在线.第二个事件有效,但在插入网络电缆和事件之间,通常有5秒的等待时间.当我拔下电缆时,Windows托盘图标会或多或少立即作出反应.像这个托盘图标一样快的最佳方法是什么?
我的解决方法是每500ms轮询一次NetworkInterface.GetAllNetworkInterfaces(),并在网络适配器的状态发生变化时抛出我自己的事件.
必须有一个更好的解决方案:)
小智 9
我尝试了Webleeuw建议的链接,但是当我插上或拔掉电缆时,该代码还需要4到10秒才能通知我.现在,我想知道它是否只是我的计算机或安装,我编写了自己的Observer类,它基于NetworkInterface.GetAllNetworkInterfaces().
并且:它以闪电般的速度工作.我的应用程序现在和托盘一样快.代码远离生产代码,它只是一个快速的黑客.但这就是我现在要建立的:)
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);
        }
    }
}
}