我想實現一個監視當前正在運行的進程的系統。系統獲取有關高負載(CPU,內存等)的信息。我調查了兩個命名空間。它是System.Diagnostics和System.Management。 首先,我寫了一個類來顯示所有正在運行的進程的名稱,ID和CPU負載。性能跟蹤的最佳做法是什麼? System.Diagnostics或System.Management?
class Program
{
static void Main()
{
Console.WriteLine("--------------using System.Diagnostics---------------------");
SysDi();
Console.WriteLine("----using System.Diagnostics CPU load always zero----------");
//Here CPU load always zero
SysDiCpuZero();
Console.WriteLine("--------------using System.Management---------------------");
Vmi();
}
static void Vmi()
{
try
{
var searcher = new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_PerfFormattedData_PerfProc_Process");
foreach (var queryObj in searcher.Get())
{
Console.WriteLine($"Process: {queryObj["Name"]} " +
$"ID: {queryObj["CreatingProcessID"]} " +
$"CPU load: {queryObj["PercentProcessorTime"]}");
}
}
catch (ManagementException e)
{
Console.WriteLine("An error occurred while querying for WMI data: " + e.Message);
}
}
static void SysDi()
{
var processlist = Process.GetProcesses();
var counters = new List<PerformanceCounter>();
foreach (var theprocess in processlist)
{
var counter = new PerformanceCounter("Process", "% Processor Time", theprocess.ProcessName);
counter.NextValue();
counters.Add(counter);
}
var i = 0;
Thread.Sleep(10);
foreach (var counter in counters)
{
Console.WriteLine($"Process: {processlist[i].ProcessName} " +
$"ID: {processlist[i].Id} " +
$"CPU load: {Math.Round(counter.NextValue(), 5)}");
++i;
}
}
static void SysDiCpuZero()
{
var processlist = Process.GetProcesses();
foreach (var theprocess in processlist)
{
var counter = new PerformanceCounter("Process", "% Processor Time", theprocess.ProcessName);
counter.NextValue();
Console.WriteLine($"Process: {theprocess.ProcessName} " +
$"ID: {theprocess.Id} " +
$"CPU load: {Math.Round(counter.NextValue(), 5)}");
}
}
}
此外,我注意到在不同的命名空間中,相同的屬性具有不同的值。 此外,System.Diagnostic比System.Management快,但方法SysDi()與CPU加載數據看起來不清楚。
有什麼更好的使用在我的情況?我應該遵循什麼標準來選擇?
根據您的平臺(Windows版本等)和需求,至少還有兩點需要考慮:性能計數器和ETW。 –
Hmya,流程類不會讓你走得很遠。更好的是通常由椅子和鍵盤之間的內容決定,而不是框架類。實際上只需要'SELECT Name'時使用'SELECT *'並不會更好。這些都是一次性類,但你不處理它們。如果您需要代碼審查,請使用http://codereview.stackexchange.com/。 –
使用ETW/xperf/WPR。 – magicandre1981