PerformanceCounter 详解,使用方法

来源:互联网 发布:c语言编程软件 编辑:程序博客网 时间:2024/05/19 16:22

这两天写代码控制CPU的占用率,显示为一条直线或者曲线,显示为一条直线的时候用到了PerformanceCounter 这个类。

 

由于对这个类还是很感兴趣的,在网上找了一些资料也不是很清楚。就自己研究了一下。

 

首先,PerformanceCounter 分为各个category, 每个category 对应不同类型的资源,一般有"Processor", "IPv6",什么的。。。下面有一个所有的类型的列表:

ThreadRAS TotalTCPv6TCPv4Paging FileSQLServer:LatchesIPsec AuthIP IPv4MSDTC Bridge 4.0.0.0IPsec AuthIP IPv6.NET CLR DataWF (System.Workflow) 4.0.0.0SynchronizationProcessorSecurity Per-Process StatisticsMSDTC Bridge 3.0.0.0Generic IKEv1, AuthIP, and IKEv2Database ==> TableClassesEvent Tracing for Windows SessionASP.NET v4.0.30319.NET CLR NetworkingObjectsTerminal ServicesBITS Net UtilizationSQLServer:User Settable.NET CLR ExceptionsIPsec IKEv2 IPv6ProcessIPsec IKEv2 IPv4SQLServer:Broker ActivationWFPv6SQLServer:Database MirroringSearch GathererTeredo RelayIPv4SQLServer:Cursor Manager TotalIPv6Job Object DetailsWFPv4IPHTTPS GlobalICMPOffline FilesSQLServer:Cursor Manager by TypeSQLAgent:JobStepsPhysicalDiskSearch IndexerWindows Workflow FoundationTeredo ServerServiceModelService 3.0.0.0Processor InformationSQLServer:Replication LogreaderSQLServer:TransactionsASP.NET Apps v4.0.30319SQLServer:Broker TO StatisticsSQLServer:Deprecated FeaturesPer Processor Network Interface Card ActivityDatabaseBrowser.NET CLR RemotingPacer PipeEvent Tracing for Windows.NET CLR LocksAndThreadsJob ObjectClient Side Caching.NET Data Provider for SqlServerASP.NET ApplicationsTerminal Services SessionSQLServer:Broker/DBM TransportNetwork Interface.NET Memory Cache 4.0SQLServer:General StatisticsSQLServer:Resource Pool StatsSQLServer:Replication MergeSecurity System-Wide StatisticsSQLServer:Backup DeviceUDPv6.NET CLR SecurityOutlook.NET CLR JitSQLServer:Workload Group StatsWFPASP.NET State ServiceSMSvcHost 4.0.0.0SQLServer:DatabasesSQLServer:LocksServer Work QueuesICMPv6NBT Connection.NET CLR LoadingServerSQLAgent:JobsRAS PortPer Processor Network Activity CyclesSMSvcHost 3.0.0.0ServiceModelEndpoint 3.0.0.0.NET CLR Networking 4.0.0.0ASP.NETUSBSQLServer:Memory ManagerCacheSQLServer:Replication SnapshotSystemRedirectorSQLServer:Wait StatisticsSQLAgent:StatisticsLogicalDisk.NET Data Provider for Oracle.NET CLR Interop分布式事务处理协调器WMI Objects.NET CLR MemorySQLServer:Access MethodsSQLServer:Buffer PartitionSQLServer:Buffer ManagerDatabase ==> InstancesReadyBoost CacheSQLServer:Plan CacheSQLServer:Replication AgentsSQLServer:Exec StatisticsTeredo ClientTelephonyIPsec IKEv1 IPv6MemorySQLServer:SQL ErrorsSQLServer:Replication Dist.ServiceModelOperation 3.0.0.0SQLServer:Buffer NodeIPsec IKEv1 IPv4Search Gatherer ProjectsIPsec DriverSQLServer:Broker StatisticsSQLServer:SQL StatisticsSQLServer:CLRSQLAgent:AlertsUDPv4SQLServer:Catalog Metadata

 

然后,每个类型下面对应多个实例,例如通过如下代码获得Processor的实例:

 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Diagnostics;namespace PerformanceCounterTest{    class Program    {        static void Main(string[] args)        {            PerformanceCounterCategory[] pcc = PerformanceCounterCategory.GetCategories();            for (int i = 0; i < pcc.Length; i++)            {                if (pcc[i].CategoryName=="Processor")                {                    Console.WriteLine("-----------------------------------");                    Console.WriteLine(pcc[i].CategoryName);                    Console.WriteLine("-----------------------------------");                    //Console.WriteLine(pcc[i].MachineName);                    string[] instanceNames = pcc[i].GetInstanceNames();                    for (int j = 0; j < instanceNames.Length; j++)                    {                        Console.WriteLine("**** Instance Name **********");                        Console.WriteLine(instanceNames[j]);                        //PerformanceCounter[] counters = pcc[i].GetCounters(instanceNames[j]);                        //Console.WriteLine("**************************************************");                        //Console.WriteLine("* counter name * ");                        //for (int k = 0; k < counters.Length; k++)                        //{                        //    Console.WriteLine(counters[k].CounterName);                        //}                    }                }            }        }    }}


输出结果为:

-----------------------------------Processor-----------------------------------**** Instance Name **********_Total**** Instance Name **********0**** Instance Name **********1请按任意键继续. . .


 

在每个实例中,又对应多个计数器,这样就需要选择你需要的计数器了。

获得的Processor类别的_Total 实例,看看这个实例都包含什么计数器,上面代码注释的部门包括计数器的输出,结果为:

-----------------------------------Processor-----------------------------------**** Instance Name **********_Total*************************************************** counter name *% Processor Time% User Time% Privileged TimeInterrupts/sec% DPC Time% Interrupt TimeDPCs Queued/secDPC Rate% Idle Time% C1 Time% C2 Time% C3 TimeC1 Transitions/secC2 Transitions/secC3 Transitions/sec**** Instance Name **********0*************************************************** counter name *% Processor Time% User Time% Privileged TimeInterrupts/sec% DPC Time% Interrupt TimeDPCs Queued/secDPC Rate% Idle Time% C1 Time% C2 Time% C3 TimeC1 Transitions/secC2 Transitions/secC3 Transitions/sec**** Instance Name **********1*************************************************** counter name *% Processor Time% User Time% Privileged TimeInterrupts/sec% DPC Time% Interrupt TimeDPCs Queued/secDPC Rate% Idle Time% C1 Time% C2 Time% C3 TimeC1 Transitions/secC2 Transitions/secC3 Transitions/sec请按任意键继续. . .


 

这样,在使用 PerformanceCounter  的时候需要指定类别,实例名,计数器名。

 PerformanceCounter pc1 = new PerformanceCounter("Processor","% Processor Time","_Total");


然后通过pc1.NextValue() 获得相关计数器的值就可以了。

原创粉丝点击