本例是利用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# 利用性能计数器监控网络状态的更多相关文章

  1. 用c#监控网络状态

    1.查询当前网络状态: using Microsoft.VisualBasic.Devices; //判断当前网络连接状态 Network nw=new Network(); if(nw.IsAvai ...

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

    Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android ...

  3. 一款监控网络状态的好工具- Smokeping

    最近工作中需要监测某个分公司到IDC机房的网络情况,到网络上找了不少软件,发现一款叫smokeping的开源软件还不错,它是rrdtool的作者制作的,在图形显示方面很漂亮,可以用来很好的检测网络状态 ...

  4. iOS实时监控网络状态的改变

    在网络应用中,有的时候需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体 ...

  5. iOS--实时监控网络状态的改变

    在网络应用中,有的时候需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行智能处理,节省用户流量,提高用户体 ...

  6. Android 监控网络状态

    public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (Conn ...

  7. ios开发利用AFN检测网络状态

    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; [manager setRe ...

  8. python利用WMI监控windows状态如CPU、内存、硬盘

    安装pywin32库 下载地址: https://sourceforge.net/projects/pywin32/files%2Fpywin32/选择对应python版本的文件.下载后在window ...

  9. .Neter玩转Linux系列之五:crontab使用详解和Linux的进程管理以及网络状态监控

    一.crontab使用详解 概述:任务调度:是指系统在某个时间执行的特定的命令或程序. 任务调度分类: (1)系统工作:有些重要的工作必须周而 复始地执行. (2)个别用户工作:个别用户可能希望执 行 ...

随机推荐

  1. CoreCRM 开发实录 —— Profile

    再简单的功能,也需要一坨代码的支持.Profile 的编辑功能主要就是修改个人的信息.比如用户名.头像.性别.电话--虽然只是一个编辑界面,但添加下来,涉及了6个文件的修改和7个新创建的文件.各种生成 ...

  2. UE4新手之编程指南

    虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...

  3. 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  4. .NET Core RC2/RTM 明确了时间表

    .NET Core 经过了将近2年的开发,去年12月份发布的RC1版本,明确来说那只是一个beta版本,自从RC1发布以来,看到github里的RC2分支,整个工具链都发生了很大的变化,大家都在焦急的 ...

  5. hadoop 2.7.3本地环境运行官方wordcount-基于HDFS

    接上篇<hadoop 2.7.3本地环境运行官方wordcount>.继续在本地模式下测试,本次使用hdfs. 2 本地模式使用fs计数wodcount 上面是直接使用的是linux的文件 ...

  6. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  7. 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  8. hadoop2.7之Mapper/reducer源码分析

    一切从示例程序开始: 示例程序 Hadoop2.7 提供的示例程序WordCount.java package org.apache.hadoop.examples; import java.io.I ...

  9. node中的Stream-Readable和Writeable解读

    在node中,只要涉及到文件IO的场景一般都会涉及到一个类-Stream.Stream是对IO设备的抽象表示,其在JAVA中也有涉及,主要体现在四个类-InputStream.Reader.Outpu ...

  10. html5 canvas常用api总结(二)--绘图API

    canvas可以绘制出很多奇妙的样式和美丽的效果,通过几个简单的api就可以在画布上呈现出千变万化的效果,还可以制作网页游戏,接下来就总结一下和绘图有关的API. 绘画的时候canvas相当于画布,而 ...