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(); } } }