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();
}
/// <summary>
/// 订阅
/// </summary>
/// <param name="_adaptername_"></param>
/// <param name="_EventHandler_"></param>
public void Subscribe(string _adaptername_ , NetworkAdapterChangedEventHandler _EventHandler_)
{
_AdapterName = _adaptername_;
if (_EventHandler_ != null)
{
NetworkAdapterChanged += _EventHandler_;
}
}
/// <summary>
/// 取消订阅
/// </summary>
/// <param name="_adaptername_"></param>
/// <param name="_EventHandler_"></param>
public void Unsubscribe(string _adaptername_, NetworkAdapterChangedEventHandler _EventHandler_)
{
if (_EventHandler_ != null)
{
NetworkAdapterChanged -= _EventHandler_;
}
}
/// <summary>
/// 开始监控
/// </summary>
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