🗿
[WPF/C#] WPFで、UWPのAPIを使ってプロセス毎のCPU時間とメモリ使用量をとる
もくじ
やりたいこと
UWPのAPIを使って、プロセスの一覧を取得したい。
ついでに、CPU時間、メモリ使用量を取得したい。
やり方
UWPのAPI「ProcessDiagnosticInfoクラス」を使う。
必要nugetライブラリ
Microsoft.Windows.SDK.Contracts
(今回は10.0.19041.1
を使用)
サンプルコード
using System;
using System.Linq;
using System.Threading;
using Windows.System.Diagnostics;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
var processes = ProcessDiagnosticInfo.GetForProcesses().Where(x => x.ExecutableFileName.Contains("chrome")).ToList();
while (true)
{
Console.Clear();
foreach (var p in processes)
{
Console.WriteLine(p.ProcessId + ", " + p.CpuUsage.GetReport().KernelTime + ", " + p.MemoryUsage.GetReport().WorkingSetSizeInBytes + ", " + p.DiskUsage.GetReport().BytesWrittenCount);
}
Thread.Sleep(2000);
}
}
}
}
注意
遅い&重い。
1つのプロセスの情報をとるくらいならそれほどでもないが、
数十個のプロセスのCPU時間を見たい、とかをやりだすと、時間がかかるうえに、CPUに負荷がかかる。
(何となく、内部でパフォーマンスカウンタを見るようなことしていて、それが重いのか?と想像)
(パフォーマンスカウンタを使っても、同じくらい重いので→こちら)
重いことに対する代替案
Processクラス
試したところ、ProcessクラスのTotalProcessorTimeとかWorkingSet64をみれば、ProcessDiagnosticInfoよりは早く情報が取れるっぽい。
ただ、それだとディスクの使用量がとれそうなプロパティがない。どこからディスク使用量とればいいのか。。。(ETWか、、、)
WMI?
試してないが、WMIでもCPU使用率、メモリ使用量、ディスク使用量やネットワーク使用量がとれるっぽい。
WMIを使うためのManagementClassの使い方
参考
ProcessDiagnosticInfoクラス(MSdocs)
Discussion