【接續上一篇 [Code] C# 效能監視器 - 取得 CPU 使用率之應用(上)】
上次我們做到了如何取得正在使用中的程序 (_instanceName),但離我們最後一步取得CPU使用率還差一點點。因此最後我們必須試圖去取得該程序的計數器(_counter),如同上一篇說到的,在效能監視器中也有很多個可以使用的功能,我們必須先知道有哪些可以選擇,再依照我們的需求來使用。
藉著 PerformanceCounterCategory 中的 GetCounters() 方法,加上原先取得的 instanceName,我們可以獲得該 instance 的 counter,程式碼如下
private static void GetCountersOfInstance(String _category, String _instanceName)
{
PerformanceCounterCategory counterCategory = new PerformanceCounterCategory(_category);
PerformanceCounter[] counters = counterCategory.GetCounters();
foreach (PerformanceCounter counter in counters)
{
Console.WriteLine("\t"+counter.CounterName);
}
}
/****************************************/
foreach (String name in instanceNames) // The code in last article
{
GetCountersOfInstance(_category , name );
}
/**********************************************/
如此就可以看到該 Instance 底下所可以使用的計數器了(如圖),而其中 "% Processor Time" 就是,其他包括記體使用量、檔案使用量等如果未來有機會再介紹(不過應該機率不大)。
當知道了我們要的 Category (類別) 與 Instance (執行個體) 以及 Counter (計數器) 後,離目標也不遠了。若只要取得單一個程序(執行個體)的 CPU 使用率,直接使用 PerformanceCounter 的建構子,將三個資料代入即可。如果是要取得所有程序的 CPU 使用率,就多使用 for 或者 foreach 把所有的數值取得,以下為整段取得執行程序 CPU 使用率的程式碼。
可使用函數有:
GetCategoryName() - 取得電腦可用之所有分類名稱
GetCountersOfInstance(String _category, String _instanceName) - 輸入分類與執行個體名稱,取得可用之計數器
GetDetailOfProcess(String _categoryName , String _counterName , String _processName) - 輸入分類、執行個體名稱以及計數器名稱取得數值
GetInstanceNameOfCategory(String _categoryName) - 主要使用函式
以上自行變化,並未寫多載。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Collections;
using System.ComponentModel;
namespace tSample
{
class Program
{
static void Main(string[] args)
{
// GetCategoryName();
// GetInstanceNameOfCategory("Process"); // Category => Process ( to get the detail information and function of process )
Console.Read();
}
private static void GetCategoryName()
{
PerformanceCounterCategory[] performanceCounterCategory;
performanceCounterCategory = PerformanceCounterCategory.GetCategories();
foreach (PerformanceCounterCategory pCounterCategory in performanceCounterCategory)
{
Console.WriteLine("\t["+pCounterCategory.CategoryName+"]");
}
}
private static void GetCountersOfInstance(String _category, String _instanceName)
{
PerformanceCounterCategory counterCategory = new PerformanceCounterCategory(_category);
PerformanceCounter[] counters = counterCategory.GetCounters();
foreach (PerformanceCounter counter in counters)
{
Console.WriteLine("\t"+counter.CounterName);
}
}
static int serial;
private static void GetDetailOfProcess(String _categoryName , String _counterName , String _processName)
{
serial++;
PerformanceCounter performanceCounter = new PerformanceCounter(_categoryName, _counterName, _processName );
Console.WriteLine("\t "+serial+". [ " + _processName + " ] : " + performanceCounter.NextValue());
}
private static void GetInstanceNameOfCategory(String _categoryName)
{
PerformanceCounterCategory category = new PerformanceCounterCategory(_categoryName); // Get the instance name of category in perfomance counter
String[] instanceNames; // Store the instance's name
PerformanceCounter[] counters;
try
{
instanceNames = category.GetInstanceNames();
if (instanceNames.Length == 0)
{
counters = category.GetCounters();
}
else // if the category exist the instances , store its' name
{
serial = 0;
foreach (String name in instanceNames)
{
//GetCountersOfInstance(_categoryName, name);
GetDetailOfProcess(_categoryName, "% Processor Time", name);
}
}
}
catch (InvalidOperationException invalidOpreationException)
{
Console.WriteLine(invalidOpreationException);
}
catch (Win32Exception wException)
{
Console.WriteLine(wException);
}
}
}
}
補上執行結果圖。
請先 登入 以發表留言。