using Azylee.Core.DataUtils.CollectionUtils;
using Azylee.Core.WindowsUtils.InfoUtils;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Azylee.Core.NetUtils
{
public class NetFlowTool
{
///
/// 上行数据流量
///
public int UploadData { get { return _UploadData; } }
private int _UploadData;
///
/// 上行数据总流量
///
public long UploadDataCount { get { return _UploadDataCount; } }
private long _UploadDataCount;
///
/// 下行数据流量
///
public int DownloadData { get { return _DownloadData; } }
private int _DownloadData;
///
/// 下行数据总流量
///
public long DownloadDataCount { get { return _DownloadDataCount; } }
private long _DownloadDataCount;
private List UploadCounter, DownloadCounter;//上行、下行流量计数器
private int DataCounterInterval = 1000;//数据流量计数器计数周期
private bool IsStart = false;
public delegate void MonitorEvent(NetFlowTool n);
public MonitorEvent DataMonitorEvent;
public string[] Instances { get { return _Instances; } }
private string[] _Instances;
private bool Init()
{
_Instances = NetCardInfoTool.GetInstanceNames();
if (ListTool.HasElements(_Instances))
{
UploadCounter = new List();
DownloadCounter = new List();
for (int i = 0; i < _Instances.Count(); i++)
{
try
{
// 添加 上行流量计数器
UploadCounter.Add(new PerformanceCounter("Network Interface", "Bytes Sent/sec", _Instances[i]));
}
catch { }
try
{
// 添加 下行流量计数器
DownloadCounter.Add(new PerformanceCounter("Network Interface", "Bytes Received/sec", _Instances[i]));
}
catch { }
}
}
if (ListTool.HasElements(UploadCounter) && ListTool.HasElements(DownloadCounter))
{
return true;
}
return false;
}
///
/// 启动流量监测
///
///
///
public bool Start(int interval = 1000)
{
if (Init() && !IsStart)
{
DataCounterInterval = interval;
IsStart = true;
Task.Factory.StartNew(() =>
{
while (IsStart)
{
DataMonitorEvent?.Invoke(this);
try
{
_UploadDataCount += _UploadData;
_UploadData = 0;
foreach (var uc in UploadCounter)
{
_UploadData += (int)uc?.NextValue();
}
_DownloadDataCount += _DownloadData;
_DownloadData = 0;
foreach (var dc in DownloadCounter)
{
_DownloadData += (int)dc?.NextValue();
}
}
catch (Exception e)
{
}
Thread.Sleep(DataCounterInterval);
}
});
return true;
}
return false;
}
///
/// 重启流量计数器
///
public void Restart()
{
if (IsStart)
{
foreach (var uc in UploadCounter)
{
uc?.Close();
}
foreach (var dc in DownloadCounter)
{
dc?.Close();
}
}
Init();
}
///
/// 重置流量表数
///
public void Reset()
{
_UploadData = 0;
_UploadDataCount = 0;
_DownloadData = 0;
_DownloadDataCount = 0;
}
///
/// 停止流量监测
///
public void Stop()
{
if (IsStart)
{
IsStart = false;
foreach (var uc in UploadCounter)
{
uc?.Close();
}
foreach (var dc in DownloadCounter)
{
dc?.Close();
}
}
}
///
/// 终结器
///
~NetFlowTool()
{
Stop();
}
}
}