C# 利用性能计数器监控网络状态

本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态。并能够直观的展现出来

涉及到的知识点:

  • PerformanceCounter,表示 Windows NT 性能计数器组件。NextValue() 即获取计数器样本并为其返回计算所得值。
  • PerformanceCounterCategory 表示性能对象,它定义性能计数器的类别。通过这两个即可得到计数器的信息。
  • Chart 图表,VS自带的Chart图表,大大简化了对图表的开发。关于Chart,此前已有例子说明
  • Queue 队列表示对象的先进先出集合。关于Queue此前已有例子说明
  • TreeView 显示标记项的分层集合,每个标记项用一个 System.Windows.Forms.TreeNode 来表示。即VS自带的树状菜单
  • Timer 实现按用户定义的时间间隔引发事件的计时器。此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用。定时刷新计数器中的值。

----------------------------------------------------------------------------------------------------

效果图如下:

关于可用的计数器列表【计数器有很多,一级菜单是计数器的类别,二级菜单是计数器InstanceName,三级菜单是计数器名称】,如下图所示:

代码如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using System.Windows.Forms.DataVisualization.Charting;
 10 using System.Diagnostics;
 11
 12 namespace DemoSharp
 13 {
 14     public partial class NetworkMonitor : Form
 15     {
 16         private PerformanceCounter mCounter;//当前计数器
 17
 18         private Queue<double> dataQueue = new Queue<double>(100);//初始化队列
 19
 20         public NetworkMonitor()
 21         {
 22             InitializeComponent();
 23             InitCounterCategory();
 24             InitChart();
 25         }
 26
 27         /// <summary>
 28         /// 初始化计数器信息
 29         /// </summary>
 30         private void InitCounterCategory() {
 31             //获取所有的计数器类别
 32             var counterCategories = PerformanceCounterCategory.GetCategories().OrderBy(p=>p.CategoryName);
 33             int i=0;
 34             foreach (var counterCategory in counterCategories) {
 35                 //属于线程级别的不显示
 36                 if (counterCategory.CategoryName == "Thread") {
 37                     continue;
 38                 }
 39                 //将信息绑定的TreeView上
 40                 this.tvCategory.CheckBoxes = true;
 41                 this.tvCategory.Nodes.Add(counterCategory.CategoryName);
 42                 string[] instanceNames = counterCategory.GetInstanceNames();
 43                 int j = 0;
 44                 foreach (var instanceName in instanceNames) {
 45                     this.tvCategory.Nodes[i].Nodes.Add(instanceName);
 46                     var counters = counterCategory.GetCounters(instanceName).Select(p=>string.Format("{0}",p.CounterName));
 47                     int k = 0;
 48                     foreach (var counter in counters) {
 49                         this.tvCategory.Nodes[i].Nodes[j].Nodes.Add(counter);
 50                         k++;
 51                     }
 52                     j++;
 53                 }
 54                 i++;
 55             }
 56             //初始化Counter
 57             PerformanceCounterCategory pcCategory = new PerformanceCounterCategory("Network Interface");
 58             string[] iNames = pcCategory.GetInstanceNames();
 59             PerformanceCounter[] pCounters = pcCategory.GetCounters(iNames[0]);
 60             //给网络监控计数器赋值
 61             mCounter = pCounters[0];
 62             mCounter.NextValue();//初始值
 63         }
 64
 65          //<summary>
 66          //初始化图表
 67          //</summary>
 68         private void InitChart()
 69         {
 70             //定义图表区域
 71             this.chart1.ChartAreas.Clear();
 72             ChartArea chartArea1 = new ChartArea("C1");
 73             this.chart1.ChartAreas.Add(chartArea1);
 74             //定义存储和显示点的容器
 75             this.chart1.Series.Clear();
 76             Series series1 = new Series("S1");
 77             series1.ChartArea = "C1";
 78             this.chart1.Series.Add(series1);
 79             //设置图表显示样式
 80             this.chart1.ChartAreas[0].AxisY.ArrowStyle = AxisArrowStyle.SharpTriangle;
 81             this.chart1.ChartAreas[0].AxisY.Title = "Kkbps";//坐标轴的标题
 82             this.chart1.ChartAreas[0].AxisY.TextOrientation = TextOrientation.Rotated270;
 83             this.chart1.ChartAreas[0].AxisY.Minimum = 0;
 84             this.chart1.ChartAreas[0].AxisY.Maximum = 50;
 85             this.chart1.ChartAreas[0].AxisY.Interval = 5;
 86             this.chart1.ChartAreas[0].AxisX.Interval = 5;
 87             this.chart1.ChartAreas[0].AxisX.ArrowStyle = AxisArrowStyle.SharpTriangle;
 88             this.chart1.ChartAreas[0].AxisX.Title = "Sec";
 89             this.chart1.ChartAreas[0].AxisX.TextOrientation = TextOrientation.Horizontal;
 90             this.chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;
 91             this.chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;
 92             //设置标题
 93             this.chart1.Titles.Clear();
 94             this.chart1.Titles.Add("S01");
 95             this.chart1.Titles[0].Text = "XXX网络监控显示";
 96             this.chart1.Titles[0].ForeColor = Color.RoyalBlue;
 97             this.chart1.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);
 98             //设置图表显示样式
 99             this.chart1.Series[0].Color = Color.LightGreen;
100             this.chart1.Series[0].ChartType = SeriesChartType.Area;//图表形状
101             this.chart1.Series[0].Points.Clear();
102         }
103
104         /// <summary>
105         /// 启动定时器
106         /// </summary>
107         /// <param name="sender"></param>
108         /// <param name="e"></param>
109         private void btnStart_Click(object sender, EventArgs e)
110         {
111             this.timer1.Start();
112
113         }
114
115         /// <summary>
116         /// 停止定时器
117         /// </summary>
118         /// <param name="sender"></param>
119         /// <param name="e"></param>
120         private void btnStop_Click(object sender, EventArgs e)
121         {
122             this.timer1.Stop();
123         }
124
125         /// <summary>
126         /// 定时执行函数
127         /// </summary>
128         /// <param name="sender"></param>
129         /// <param name="e"></param>
130         private void timer1_Tick(object sender, EventArgs e)
131         {
132             UpdateQueueValue();
133             this.chart1.Series[0].Points.Clear();
134             if (dataQueue.Max() > this.chart1.ChartAreas[0].AxisY.Maximum) {
135                 this.chart1.ChartAreas[0].AxisY.Maximum = Math.Ceiling(dataQueue.Max() / 10) * 10;
136                 this.chart1.ChartAreas[0].AxisY.Interval = this.chart1.ChartAreas[0].AxisY.Maximum / 10;
137             }
138             for (int i = 0; i < dataQueue.Count; i++)
139             {
140                 this.chart1.Series[0].Points.AddXY((i + 1), dataQueue.ElementAt(i));
141             }
142         }
143
144          //更新队列中的值
145         private void UpdateQueueValue()
146         {
147
148             if (dataQueue.Count > 100)
149             {
150                 dataQueue.Dequeue();
151             }
152             //获取的值就Byte/s 所以要除以1024
153             dataQueue.Enqueue(mCounter.NextValue() / (1024));
154
155         }
156
157         /// <summary>
158         /// 当选中复选框时发生
159         /// </summary>
160         /// <param name="sender"></param>
161         /// <param name="e"></param>
162         private void tvCategory_AfterCheck(object sender, TreeViewEventArgs e)
163         {
164             bool flag = e.Node.Checked;//取得选中状态,所有子节点的状态保持一致
165             CheckedStated(e.Node.Nodes, flag);
166         }
167
168         /// <summary>
169         /// 采用递归方法修改节点的选中状态
170         /// </summary>
171         /// <param name="nodes"></param>
172         /// <param name="flag"></param>
173         private void CheckedStated(TreeNodeCollection nodes,bool flag) {
174
175             if (nodes != null)
176             {
177                 foreach (TreeNode node in nodes)
178                 {
179                     node.Checked = flag;
180                     CheckedStated(node.Nodes, flag);
181                 }
182             }
183         }
184     }
185 }

备注:性能计数器类别获取出现异常的解决方案:

在CMD命令窗口中,执行 LODCTR /R 重置性能计数器。如下图所示:

如果依然不行,尝试以管理员身份运行【勾上】,如下图所示:

--------------------------------------------------------------------------------------------------------------------

时间: 2024-08-07 21:19:56

C# 利用性能计数器监控网络状态的相关文章

AFN监控网络状态(代码)

利用AFN进行网络状态监控: #import "HMViewController.h" #import "AFNetworking.h" @interface HMViewController () @end @implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typ

top命令详解 动态的监控网络状态

1.top命令:可以动态的监控cpu 参数说明:当前时间 系统启动多久了 当前登录的人数 当前系统的负载情况(三个数和/3>0.6就危险了) 目前有多少进程数 :休眠的进程数,运行的进程数,僵死进程数(已没有用了,但是还是占据内存),静止状态下的进程数 cpu的状态(idle cpu的资源空间大小) Mem内容使用情况:内存总数,正在被使用,空闲的, Swap(虚拟内存):真实内存 使用内存 以下是top命令: top -d 10 :设置动态监控时间10s top -u user :设置要监控的

Android中判断网络连接是否可用及监控网络状态

Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android中判断网络连接是否可用及监控网络状态,感兴趣的朋友可以参考下 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"

Android 监控网络状态

Html代码 public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity == null) { Log.i("NetWorkState", "Unavailabe

用c#监控网络状态

1.查询当前网络状态: using Microsoft.VisualBasic.Devices; //判断当前网络连接状态 Network nw=new Network(); if(nw.IsAvailable) lbmsg.Text="网络已连接"; else lbmsg.Text="网络已断开"; 2.实时监控网络状态 using System.Net.NetworkInformation; // Constructor public MainPage() {

iOS核心笔记——网络编程-监控网络状态

1.AFN监控网络状态: 1.- (void)afnMonitoring2.{3. // 开始网络监控4. AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];5.6. [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {7. NSLog(@"-----当前的网络状态---%zd&quo

脚本监控网络状态,输出日志并归档

脚本监控网络状态&日志归档整理 最近为检测VPN环境网络状态是否稳定,没有使用监控zabbix等监控工具,为方便快捷,使用脚本实现网络监控,并输出日志归档整理,方便后续排查. 在次记录一下,以备后用: #!/bin/bash #mail:[email protected] IP=baidu.com                #IP&域名 dir="/tools/netdir/" if [ -d ${dir} ];then     mkdir -p ${dir} fi

脚本监控网络状态,输出日志并归档(V2)

脚本监控网络状态&日志归档整理(V2) 最近为检测VPN环境网络状态是否稳定,没有使用监控zabbix等监控工具,为方便快捷,使用脚本实现网络监控,并输出日志归档整理,方便后续排查. 在上次基础上,新增了微信告警,并有收敛效果,只有在初次异常时告警,恢复后发送恢复通知,也可以根据具体需求设置短信与邮件告警. #!/bin/bash IP=10.234.100.100 dir="/netdir/" if [ ! -d ${dir} ];then     mkdir -p ${di

Android判断网络类型以及监控网络状态

一.判断网络类型是wifi,还是3G,还是2G网络 ConnectivityManager connectMgr = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = connectMgr.getActiveNetworkInfo(); 一.判断网络是否是wifi,在判断之前一定要进行的非空判断,如果没有任何网络 连接info ==null info.getT