写在前面:

作为Web应用开发前线的一枚小兵,每看到“性能”一词总有种要亮瞎眼的感觉,说到“性能”那就不能不提“数据”,在程序猿、攻城师中不是流行这样一句话吗?“无图无真相”,谁要说谁开发的应用性能有多好多好,那么要亮瞎我们这些小兵的眼睛,就不得不拿出“数据”来说话啦,显然,我们有一个能够为我们提供“数据”的工具是多么的重要。今天就来学习一下使用C#是如何实现计数器的?(本文侧重于具体实现)

简要Windows性能监视器:

打开Windows性能监视器的步骤如下:

开始→运行→perfmon→确定

在这里我们可以选择添加我们要监控的计数器,比如:cpu使用率、内存使用量等,作为asp.net攻城师我们还可以使用它来监控我们站点的请求队列、应道队列数量、请求总数等。比如我们要开可用内存的信息:

可用内存大小事实数据如下:

瞬间感觉到在微软怀抱下的孩纸好幸福有木有。好啦接下来我们来看看C#是如何调用它的,并且是如何自定义自己的计数器的呢?

C#如何调用本地主机Windows性能监视器获取数据

上代码:

using System;
using System.Collections.Generic;
using System.Text;
//应引用此名门空间
using System.Diagnostics;
using System.Threading; namespace Performance_Demo
{
class Class1
{
static void Main(string[] arge)
{
//性能计数器组件类
PerformanceCounter cpu = new PerformanceCounter("Memory", "Available MBytes", "");
while (true)
{
Console.WriteLine("{0} MB",cpu.NextValue()); Thread.Sleep(1000);
}
}
}
}

  结果如下:

代码很简单,最主要的就是一个PerformanceCounter类的实例cpu,PerformanceCounter类有5个构造函数重载,就代码中的构造函数讲述,构造函数为new PerformanceCounter(“计数器类型名称”,“计数器名称”,“计数器实例名称”),(如果该计数器为单实例,那么计数器实例名称可为“”)。可使用实例的NextValue()方法获取当前值。

呵呵,当你看到代码时会说“如此 so easy”,但你可能对“计数器类型名称”,“计数器名称”,“计数器实例名称”这三个名称有点糊涂啦吧,别着急,先看一张图:

对这张图不陌生吧,没错,添加可用内存计数器时见过,那么“1”就是“计数器类型名称”,“2”就是“计数器名称”,“3”就是“计数器实例名称”(应为该计数器是单实例的,所以“3”下面没有具体的实例),所以三者的关系我们可以归纳为:计数器类型》计数器》计数器实例。赶紧试一下吧小伙伴们。。。

C#如何调用远程主机Windows性能监视器获取数据

上代码

    class Class3
{
//访问远程主机的性能监视器
static void Main(string[] arge)
{
//先于远程IP建立连接
string tmpstr = "net use \\\\" + "172.16.164.000" + "\\ipc$ " + "密码" + " /user:" + "用户名";
RunDOS(tmpstr); //性能计数器组件类
PerformanceCounter cpu = new PerformanceCounter("Memory", "Available MBytes", "", "172.16.164.215"); while (true)
{
Console.WriteLine("{0} MB", cpu.NextValue()); Thread.Sleep(1000);
}
}
//使用DOS运行命令
static void RunDOS(string DOS)
{
Process p = null;
p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
string strOutput = "";
p.StandardInput.WriteLine(DOS);
p.StandardInput.WriteLine("exit");
while (p.StandardOutput.EndOfStream)
{
strOutput = p.StandardOutput.ReadLine();
}
p.WaitForExit();
p.Close();
}
}

  代码也很简单,与调用本地主机不同之处就是多了一段运行DOS命令的代码,目的就是先与远程主机建立连接,需要指定远程主机IP、用户名、密码(可以为一般管理员身份),此时需要注意的是远程主机上的“Remote Registry”服务应处于启动状态,目的是为了能让远程用户能修改此计算机上的注册表。

C#如何自定义计数器

前面我们学习如何使用C#调用Windows性能监视器,来获取系统的各个计数器实时数据,那么我们可不可以自己定义一个计数器,并且添加到性能监视器中供我们实时查看呢?答案是肯定的。试想一下我们在日常开发当中会有类似这样的需求:我们有一个队列(可能是各种命令啊或者是消息啊、订单啊等等),那么我们想有一个可视化的东西来监控一下这个队列中积压了多少内容,当然啦我们万能的攻城师们肯定希望积压数量永远是0啦,哈哈,此时我们就可以为我们的队列设计一个计数器,那么我们就可以在Windows性能监视器中找到并且实时查看队列积压情况啦。(开始动手吧)

先上代码:

(代码就语无伦次吧,神马都不讲究啦)

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Collections; namespace Performance_Demo
{
class Class2
{
//我的队列
static Queue<int> myQueue = new Queue<int>();
//计数器实例
static PerformanceCounter counter1 = null;
static void Main(string[] arge)
{ //计数器类型名称
string CategoryName = "a_yigebeiyiwangdebaozi";
//计数器名称
string CounterName = "a_yigebeiyiwangdebaozi_counter1";
if (PerformanceCounterCategory.Exists(CategoryName))
{
PerformanceCounterCategory.Delete(CategoryName);
} CounterCreationDataCollection ccdc = new CounterCreationDataCollection();
//计数器
CounterCreationData ccd = new CounterCreationData(CounterName, "myCounter", PerformanceCounterType.NumberOfItems64);
ccdc.Add(ccd);
//使用PerformanceCounterCategory.Create创建一个计数器类别
PerformanceCounterCategory.Create(CategoryName, "", PerformanceCounterCategoryType.MultiInstance, ccdc);
//初始化计数器实例
counter1 = new PerformanceCounter();
counter1.CategoryName = CategoryName;
counter1.CounterName = CounterName;
counter1.InstanceName = "myCounter1";
counter1.InstanceLifetime = PerformanceCounterInstanceLifetime.Process;
counter1.ReadOnly = false;
counter1.RawValue = 0; while (true)
{
EnqueueQueue();
System.Threading.Thread.Sleep(1000);
DequeueQueue();
}
} static void EnqueueQueue()
{
int C = new Random().Next(10);
for (int i = 0; i < C; i++)
{
myQueue.Enqueue(i);
//计数器加一
counter1.Increment();
}
} static void DequeueQueue()
{
int C = new Random().Next(20);
for (int i = 0; i < C; i++)
{
if (myQueue.Count == 0)
break;
myQueue.Dequeue();
//计数器减一
counter1.Decrement();
} }
}
}

  我们先在性能监视器中找到我们的计数器如下:

我们队列的实时数据如下:

好啦,我们的计数器完成啦!

快下班啦就写到这里,如有错误请土豪们指正。

学习C#——性能计数器的更多相关文章

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

    本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态.并能够直观的展现出来 涉及到的知识点: PerformanceCounter,表示 Windows NT 性能计数器 ...

  2. 性能计数器与profiler的组合性能诊断

    性能计数器和sql profiler都是常用的性能诊断工具和优化工具,最近和群友聊天发现很多人竟然不知道这两个可以“组合”使用,所以这篇算是一篇扫盲贴吧. 两种工具简述 通过计数器可以收集两部分内容: ...

  3. [EntLib]微软企业库5.0 学习之路——第一步、基本入门

    话说在大学的时候帮老师做项目的时候就已经接触过企业库了但是当初一直没明白为什么要用这个,只觉得好麻烦啊,竟然有那么多的乱七八糟的配置(原来我不知道有配置工具可以进行配置,请原谅我的小白). 直到去年在 ...

  4. C#——性能计数器

    简要Windows性能监视器: 打开Windows性能监视器的步骤如下: 开始→运行→perfmon→确定 在这里我们可以选择添加我们要监控的计数器,比如:cpu使用率.内存使用量等,作为asp.ne ...

  5. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  6. Python入门基础学习(时间模块,随机模块)

    Python基础学习笔记(六) time模块: 时间的三种表示方法: 1.格式化字符串 2.时间戳 用来表示和1970年的时间间隔,单位为s 3.元组 struct_time 9个元素 time的st ...

  7. 学习PHP中的高精度计时器HRTime扩展

    不知道大家还记得在学校的时候体育测试时老师带的秒表吗?当枪声想起时,我们开始跑步,这时秒表启动,当我们跑过终点后,老师会按下按扭记录我们的成绩,这就是一个典型的定时器的应用.今天我们要学习的内容其实就 ...

  8. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  9. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

随机推荐

  1. Linux下使用ping出现destination is unreachable的问题可能性

    ping时出现request time out和destination is unreachable request time out是指icmp包发出后,长时间没有回应,所以会产生request t ...

  2. Linux网络设置1——Linux网络环境配置

    方法一: ① 利用root登陆,输入setup命令 ② 选择Network configuration,进入Configure TCP/IP界面 ③ 第一个[],若光标在此,按空格出现*号,则自动分配 ...

  3. 使用Dragablz快速构建Chrome样式的可拖拽分离的Tab页程序

    今天发现了一个可以快速实现类似于Chrome方式的可拖拽分离的Tab页程序Dragablz.它可以实现动态创建,删除Tab页,并支持拖拽后形成独立窗口和窗口合并.   使用起来还是非常方便的. < ...

  4. HDU 4493 Tutor (水题)

    Tutor Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submi ...

  5. Centos7安装配置tomcat 9并设置自动启动

    原文:https://blog.csdn.net/stinkstone/article/details/78082725 1.官网下载安装包 这里选择适合Linux的安装包,下载到本地后上传到cent ...

  6. shiro+redis实现session共享

    shiro配置内容

  7. 理解JavaScript中的事件流

    原文地址:http://my.oschina.net/sevenhdu/blog/332014 目录[-] 事件冒泡 事件捕获 DOM事件流 当浏览器发展到第四代时(IE4和Netscape Comm ...

  8. iOS:面向对象的思想使用sqlite数据库

    SQLite支持的常见数据类型如下所示. –INTEGER 有符号的整数类型 –REAL 浮点类型 –TEXT 字符串类型,采用UTF-8和UTF-16字符编码 –BLOB 二进制大对象类型,能够存放 ...

  9. js定义对象并赋值

    1.可以通过  var ratio = {}; ratio.low = 70; ratio.high = 90; ratio.scale = 0.2; 2.可以通过 var obj = new Obj ...

  10. Linux laravel安装

    第一步:安装php套件 目前为止laravel是5.1版本,需要对php有要求,要php5.59以上 The Laravel framework has a few system requiremen ...