写在前面:

作为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. 如何更新phpStorm SVN项目地址

    公司内网服务器换了IP地址,导致phpStorm 中的SVN更新不上去 如何在phpStorm中配置SVN这里就不赘述了,网上很多,自行百度 这里说一下如何更改phpStorm 中SVN地址 找到项目 ...

  2. BZOJ 2301: [HAOI2011]Problem b (莫比乌斯反演)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 436  Solved: 187[Submit][S ...

  3. Spring+JDBC实例

    1. Customer 表 在这个例子中,我们使用的是MySQL数据库. CREATE TABLE `customer` ( `CUST_ID` int(10) unsigned NOT NULL A ...

  4. MySQL 一个库中表数量是否有限制?

    在网上找了一下,有说几乎没有限制的,也有说表多了肯定会影响性能的,综合起来应该讲: 1)一个库中表数是有限制的, 按照 UNSIGNED 类型,最多42亿多一点,正常应用根本达不到.   2)文件系统 ...

  5. java读写锁实现数据同步访问

    锁机制最大的改进之一就是ReadWriteLock接口和它的唯一实现类ReentrantReadWriteLock.这个类有两个锁,一个是读操作锁,另一个是写操作锁.使用读操作锁时可以允许多个线程同时 ...

  6. What is the fastest way of (not) logging?

    原文地址:http://www.slf4j.org/faq.html#logging_performance SLF4J supports an advanced feature called par ...

  7. End of Life check fails with NullPointerException

    Checks if the running version of JIRA is approaching, or has reached End of Life. Details Type: Bug ...

  8. List of Chromium Command Line Switches(命令行开关集)——官方指定命令行更新网址

    转自:http://peter.sh/experiments/chromium-command-line-switches/ There are lots of command lines which ...

  9. iOS开源项目:AwesomeMenu

    https://github.com/levey/AwesomeMenu 模仿Path的menu,使用CoreAnimation实现. 1.首先说使用 AwesomeMenuItem *starMen ...

  10. C#模拟MSN窗体抖动

    C#模拟MSN窗体抖动 窗体抖动是件很有意思的事情,就让我们看看一起来看看它的原理吧. 其实是生成随机数,然后改变Form的左上角的坐标.我用的是循环来弄得,其实可以用timer来控制. 我把抖动分成 ...