C# 利用性能计数器监控网络状态
本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态,并能够直观的展现出来。本文仅供学习分享使用,如有不足之处,还请指正。
涉及知识点:
- PerformanceCounter,表示 Windows NT 性能计数器组件。NextValue() 即获取计数器样本并为其返回计算所得值。
- PerformanceCounterCategory 表示性能对象,它定义性能计数器的类别。通过这两个即可得到计数器的信息。
- Chart 图表,VS自带的Chart图表,大大简化了对图表的开发。关于Chart,此前已有例子说明
- Queue 队列表示对象的先进先出集合。关于Queue此前已有例子说明
- TreeView 显示标记项的分层集合,每个标记项用一个 System.Windows.Forms.TreeNode 来表示。即VS自带的树状菜单
- Timer 实现按用户定义的时间间隔引发事件的计时器。此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用。定时刷新计数器中的值。
效果图
如下图所示:

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

核心代码
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using System.Diagnostics; namespace DemoSharp
{
public partial class NetworkMonitor : Form
{
private PerformanceCounter mCounter;//当前计数器 private Queue<double> dataQueue = new Queue<double>();//初始化队列 public NetworkMonitor()
{
InitializeComponent();
InitCounterCategory();
InitChart();
} /// <summary>
/// 初始化计数器信息
/// </summary>
private void InitCounterCategory() {
//获取所有的计数器类别
var counterCategories = PerformanceCounterCategory.GetCategories().OrderBy(p=>p.CategoryName);
int i=;
foreach (var counterCategory in counterCategories) {
//属于线程级别的不显示
if (counterCategory.CategoryName == "Thread") {
continue;
}
//将信息绑定的TreeView上
this.tvCategory.CheckBoxes = true;
this.tvCategory.Nodes.Add(counterCategory.CategoryName);
string[] instanceNames = counterCategory.GetInstanceNames();
int j = ;
foreach (var instanceName in instanceNames) {
this.tvCategory.Nodes[i].Nodes.Add(instanceName);
var counters = counterCategory.GetCounters(instanceName).Select(p=>string.Format("{0}",p.CounterName));
int k = ;
foreach (var counter in counters) {
this.tvCategory.Nodes[i].Nodes[j].Nodes.Add(counter);
k++;
}
j++;
}
i++;
}
//初始化Counter
PerformanceCounterCategory pcCategory = new PerformanceCounterCategory("Network Interface");
string[] iNames = pcCategory.GetInstanceNames();
PerformanceCounter[] pCounters = pcCategory.GetCounters(iNames[]);
//给网络监控计数器赋值
mCounter = pCounters[];
mCounter.NextValue();//初始值
} //<summary>
//初始化图表
//</summary>
private void InitChart()
{
//定义图表区域
this.chart1.ChartAreas.Clear();
ChartArea chartArea1 = new ChartArea("C1");
this.chart1.ChartAreas.Add(chartArea1);
//定义存储和显示点的容器
this.chart1.Series.Clear();
Series series1 = new Series("S1");
series1.ChartArea = "C1";
this.chart1.Series.Add(series1);
//设置图表显示样式
this.chart1.ChartAreas[].AxisY.ArrowStyle = AxisArrowStyle.SharpTriangle;
this.chart1.ChartAreas[].AxisY.Title = "Kkbps";//坐标轴的标题
this.chart1.ChartAreas[].AxisY.TextOrientation = TextOrientation.Rotated270;
this.chart1.ChartAreas[].AxisY.Minimum = ;
this.chart1.ChartAreas[].AxisY.Maximum = ;
this.chart1.ChartAreas[].AxisY.Interval = ;
this.chart1.ChartAreas[].AxisX.Interval = ;
this.chart1.ChartAreas[].AxisX.ArrowStyle = AxisArrowStyle.SharpTriangle;
this.chart1.ChartAreas[].AxisX.Title = "Sec";
this.chart1.ChartAreas[].AxisX.TextOrientation = TextOrientation.Horizontal;
this.chart1.ChartAreas[].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;
this.chart1.ChartAreas[].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;
//设置标题
this.chart1.Titles.Clear();
this.chart1.Titles.Add("S01");
this.chart1.Titles[].Text = "XXX网络监控显示";
this.chart1.Titles[].ForeColor = Color.RoyalBlue;
this.chart1.Titles[].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);
//设置图表显示样式
this.chart1.Series[].Color = Color.LightGreen;
this.chart1.Series[].ChartType = SeriesChartType.Area;//图表形状
this.chart1.Series[].Points.Clear();
} /// <summary>
/// 启动定时器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
this.timer1.Start(); } /// <summary>
/// 停止定时器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStop_Click(object sender, EventArgs e)
{
this.timer1.Stop();
} /// <summary>
/// 定时执行函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
UpdateQueueValue();
this.chart1.Series[].Points.Clear();
if (dataQueue.Max() > this.chart1.ChartAreas[].AxisY.Maximum) {
this.chart1.ChartAreas[].AxisY.Maximum = Math.Ceiling(dataQueue.Max() / ) * ;
this.chart1.ChartAreas[].AxisY.Interval = this.chart1.ChartAreas[].AxisY.Maximum / ;
}
for (int i = ; i < dataQueue.Count; i++)
{
this.chart1.Series[].Points.AddXY((i + ), dataQueue.ElementAt(i));
}
} //更新队列中的值
private void UpdateQueueValue()
{ if (dataQueue.Count > )
{
dataQueue.Dequeue();
}
//获取的值就Byte/s 所以要除以1024
dataQueue.Enqueue(mCounter.NextValue() / ()); } /// <summary>
/// 当选中复选框时发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tvCategory_AfterCheck(object sender, TreeViewEventArgs e)
{
bool flag = e.Node.Checked;//取得选中状态,所有子节点的状态保持一致
CheckedStated(e.Node.Nodes, flag);
} /// <summary>
/// 采用递归方法修改节点的选中状态
/// </summary>
/// <param name="nodes"></param>
/// <param name="flag"></param>
private void CheckedStated(TreeNodeCollection nodes,bool flag) { if (nodes != null)
{
foreach (TreeNode node in nodes)
{
node.Checked = flag;
CheckedStated(node.Nodes, flag);
}
}
}
}
}
备注:
性能计数器类别获取出现异常的解决方案:
在CMD命令窗口中,执行 LODCTR /R 重置性能计数器。如下图所示:

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

--------------------------------------------------------------------------------------------------------------------
C# 利用性能计数器监控网络状态的更多相关文章
- 用c#监控网络状态
1.查询当前网络状态: using Microsoft.VisualBasic.Devices; //判断当前网络连接状态 Network nw=new Network(); if(nw.IsAvai ...
- Android中判断网络连接是否可用及监控网络状态
Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android ...
- 一款监控网络状态的好工具- Smokeping
最近工作中需要监测某个分公司到IDC机房的网络情况,到网络上找了不少软件,发现一款叫smokeping的开源软件还不错,它是rrdtool的作者制作的,在图形显示方面很漂亮,可以用来很好的检测网络状态 ...
- iOS实时监控网络状态的改变
在网络应用中,有的时候需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体 ...
- iOS--实时监控网络状态的改变
在网络应用中,有的时候需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体 ...
- Android 监控网络状态
public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (Conn ...
- ios开发利用AFN检测网络状态
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; [manager setRe ...
- python利用WMI监控windows状态如CPU、内存、硬盘
安装pywin32库 下载地址: https://sourceforge.net/projects/pywin32/files%2Fpywin32/选择对应python版本的文件.下载后在window ...
- .Neter玩转Linux系列之五:crontab使用详解和Linux的进程管理以及网络状态监控
一.crontab使用详解 概述:任务调度:是指系统在某个时间执行的特定的命令或程序. 任务调度分类: (1)系统工作:有些重要的工作必须周而 复始地执行. (2)个别用户工作:个别用户可能希望执 行 ...
随机推荐
- LeetCode: 3Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...
- 异常处理汇总 ~ 修正果带着你的Net飞奔吧!
经验库开源地址:https://github.com/dunitian/LoTDotNet 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983 ...
- shell简介
Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...
- iOS系列文章
本博客全为原创,如果借鉴了其他文章会在博文的下面进行说明.欢迎转载,但要在文章中给出原文链接,谢谢. 有链接的说明已经发布,没有链接的说明还没有发布. 并不是所有的博文都在这里罗列,有兴趣的可以看博客 ...
- .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来
从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...
- 小兔Java教程 - 三分钟学会Java文件上传
今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...
- 初学seaJs模块化开发,利用grunt打包,减少http请求
原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...
- Loadrunner Http Json接口压力测试
前天接到了一个测试任务,要求测试一下ES(elsticsearch)在不同并发下的查询效率.如图: 业务场景是在客户端根据具体车牌查询相关车辆信息,结果返回前10条记录. 从图中可以看到,接口的请求参 ...
- 利用Select2优化@Html.ListBoxFor显示,学会用MultiSelectList
最近需要用到多选框,Asp.Net MVC自带的@Html.ListBox或@Html.ListBoxFor的显示效果太差,于是找到了Select2进行优化,并正式了解了多选框的操作方法. 首先介绍多 ...
- iOS之开发中常用的颜色及其对应的RGB值
R G B 值 R G B 值 R G B 值 黑色 0 0 0 #000000 黄色 255 255 0 #FFFF00 浅灰蓝色 176 224 230 #B0E0E6 象牙黑 41 ...