using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.NetworkInformation;
using System.Threading;
namespace NetworkAdapterTestEvent
{
class Program
{
static void Main(string[] args)
{
NetworkAdapterAvailable newtest = new NetworkAdapterAvailable();
newtest.Subscribe("本地连接",new NetworkAdapterAvailable.NetworkAdapterChangedEventHandler(NetowrkAdapter_changed));
newtest.StartMonitor();
Console.ReadLine();
newtest.StopMonitor();
newtest.Unsubscribe("本地连接", new NetworkAdapterAvailable.NetworkAdapterChangedEventHandler(NetowrkAdapter_changed));
}
static void NetowrkAdapter_changed(object sender, NetworkAdapterChangedArgument e)
{
Console.WriteLine("Name:{0}\tStatus:{1}", e.AdapterName, e.AdapterStatus.ToString());
}
}
public class NetworkAdapterAvailable
{
public delegate void NetworkAdapterChangedEventHandler(object send , NetworkAdapterChangedArgument e);
public event NetworkAdapterChangedEventHandler NetworkAdapterChanged;
private Thread _AdapterCheckThread;
private string _AdapterName;
private bool _Stop = false;
private NetworkInterface[] _adapters;
public NetworkAdapterAvailable()
{
_adapters = NetworkInterface.GetAllNetworkInterfaces();
}
///
/// 订阅
///
///
///
public void Subscribe(string _adaptername_ , NetworkAdapterChangedEventHandler _EventHandler_)
{
_AdapterName = _adaptername_;
if (_EventHandler_ != null)
{
NetworkAdapterChanged += _EventHandler_;
}
}
///
/// 取消订阅
///
///
///
public void Unsubscribe(string _adaptername_, NetworkAdapterChangedEventHandler _EventHandler_)
{
if (_EventHandler_ != null)
{
NetworkAdapterChanged -= _EventHandler_;
}
}
///
/// 开始监控
///
public void StartMonitor()
{
_AdapterCheckThread = new Thread(new ThreadStart(AdapterCheckHandler));
_AdapterCheckThread.IsBackground = true;
_AdapterCheckThread.Start();
}
public void StopMonitor()
{
_Stop = true;
if (_AdapterCheckThread != null)
{
_AdapterCheckThread.Join();
}
}
private void AdapterCheckHandler()
{
while (!_Stop)
{
NetworkInterface[] __adapters = NetworkInterface.GetAllNetworkInterfaces();
for (int i = 0; i < __adapters.Length; i++)
{
if (_adapters[i].Name == _AdapterName)
{
if (_adapters[i].OperationalStatus != __adapters[i].OperationalStatus)
{
NetworkAdapterChanged(this, new NetworkAdapterChangedArgument(_AdapterName, __adapters[i].OperationalStatus));
_adapters[i] = __adapters[i];
}
}
}
Thread.Sleep(100);
}
}
}
public class NetworkAdapterChangedArgument : EventArgs
{
private string _AdapterName;
private OperationalStatus _AdapterStatus;
public NetworkAdapterChangedArgument(string _adaptername_, OperationalStatus _adapterstatus_)
{
_AdapterName = _adaptername_;
_AdapterStatus = _adapterstatus_;
}
public string AdapterName
{
get { return _AdapterName; }
}
public OperationalStatus AdapterStatus
{
get { return _AdapterStatus; }
}
}
}
//csharp/1132