写在前面:

作为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. Objective-C-类(static)方法、实例方法、overwrite(覆写)、属性(property)复习

    先来定义一个Human父类 定义部分: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // //  Human.h //  OOP // //  ...

  2. 分布式服务的事务如何处理?比如dubbo,服务与服务之间的事务怎么处理比较好,现在有没有开源的解决方案?

    作者:何明璐链接:http://www.zhihu.com/question/29483490/answer/98237582来源:知乎著作权归作者所有,转载请联系作者获得授权. 首先是不建议采用XA ...

  3. Spring bean配置继承

    在 Spring,继承是用为支持bean设置一个 bean 来分享共同的值,属性或配置. 一个子 bean 或继承的bean可以继承其父 bean 的配置,属性和一些属性.另外,子 Bean 允许覆盖 ...

  4. 【资料】wod强壮护符

    泛用耗材 损坏的 卡罗先活力护符 小型的 强壮护符 改良的 鲁比斯护符   否定护符   活跃护符   自然防御护符   防御疾病护符 特定职业使用耗材护符 野蛮人 诗人 祭司 泛用 仪式用巴博许教的 ...

  5. 【资料】wod属性

    各个属性的影响力量 st 影响近战远程伤害和体力体质 co 影响体力(比力量的影响大)智力 in 影响法力和魔法防御灵巧 dx 影响近战远程命中和近战躲闪魅力 ch 影响诅咒和治愈能力,诅咒攻击命中和 ...

  6. 微信开发之如何使用开发工具--weixin-java-tools

    一.前沿 微信公众平台由于没有提供针对语言的开发包,只公布了一个基于Http协议的接口和加解密的算法sdk,这样给微信公众号的开发者带来很多工作量,除了实现业务逻辑外,还需要自己处理底层的接口协议细节 ...

  7. 《Android传感器高级编程》

    <Android传感器高级编程> 基本信息 原书名:Professional Android Sensor Programming 原出版社: Wrox 作者: (美)米内特(Greg M ...

  8. Microsoft Visual C++ 6.0预处理器参考手册

    返回总目录 Microsoft Visual C++ 6.0 预处理器参考手册 目录引言........................................................ ...

  9. 20.custom自定义线程池

    自定义线程池 1.若Executors工厂类无法满足需求,可以自己使用工厂类创建线程池,底层都是使用了); ThreadPoolExecutor threadPoolExecutor = new Th ...

  10. [C#.NET] 使用 X509 數位電子簽章 加解密

    摘自: http://www.dotblogs.com.tw/yc421206/archive/2012/06/30/73150.aspx 上篇提到了使用X509的的憑證使用方式,請參考 [C#.NE ...