第一個是通過手動的方法來計算CPU使用比例:CPU使用比例 = 在間隔時間內進程的CPU使用時間 除以 電腦邏輯CPU數量。
使用Process類的UserProcessorTime和PrivilegedProcessorTime屬性可以返回當前進程所耗費CPU的使用者和核心程式的時間。Process.TotalProcessorTime則代表兩者之和。它們都返回TimeSpan結構體對象。
代碼:
//+ using System.Diagnostics
//+ using System.Threading
static void UsingProcess(string pname)
{
using (var pro = Process.GetProcessesByName(pname)[0])
{
//間隔時間(毫秒)
int interval = 1000;
//上次記錄的CPU時間
var prevCpuTime = TimeSpan.Zero;
while (true)
{
//目前時間
var curTime = pro.TotalProcessorTime;
//間隔時間內的CPU已耗用時間除以邏輯CPU數量
var value = (curTime - prevCpuTime).TotalMilliseconds / interval / Environment.ProcessorCount * 100;
prevCpuTime = curTime;
//輸出
Console.WriteLine(value);
Thread.Sleep(interval);
}
}
}
注意:
經測試上述方法同下面方法一樣結果都比較準確,而且上面的方法更快(考慮到下面效能計數器的使用,尤其是多個重複進程名稱在效能計數器中的處理),而上面方法可以直接用進程ID(PID)查詢,因為用的是Process類,這是效能計數器不能快速做到的。
但是,上面的方法僅有一個缺點,當監控某些系統進程時可能會拋出Win32Exception異常指示“訪問被拒絕”(即便是你已經使用管理員賬戶來運行程式)。
第二個是用效能計數器(PerformanceCounter)來監控,這個有現成的效能計數器專門做這個工作,可以直接參考控制台中效能監控裡的Process類的% Processor Time效能計數器。
唯一需要注意的地方是:改效能計數器的傳回值沒有考慮到多核(多個)CPU的情況,所以計算結果應該除以CPU數量!
代碼:
static void UsingPerfmon(string pname)
{
//建立效能計數器
using (var p1 = new PerformanceCounter("Process", "% Processor Time", pname))
{
while (true)
{
//注意除以CPU數量
Console.WriteLine(p1.NextValue() / Environment.ProcessorCount);
Thread.Sleep(1000);
}
}
}
直接調用方法(需要指定一個進程名稱)就可以每個一段時間輸出改進程的CPU使用百分比:
比如看看Windows工作管理員的CPU使用率:
//或者UsingPerfmon("taskmgr");
UsingProcess("taskmgr");