欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在NET Core 中获取 CPU 使用率

程序员文章站 2022-05-21 23:20:43
...

以下文章来源于微信公众号DotNetCore实战

在 .NET Framework 中,很多人会用 PerformanceCounter 类做这件事情,

如下代码:
` public class Program
{
public static void Main(string[] args)
{
while (true)
{
var cpuUsage = GetCpuUsageForProcess();

  1. Console.WriteLine(cpuUsage);
  2. }
  3. }
  4. private static int GetCpuUsageForProcess()
  5. {
  6. var currentProcessName = Process.GetCurrentProcess().ProcessName;
  7. var cpuCounter = new PerformanceCounter("Process", "% Processor Time", currentProcessName);
  8. cpuCounter.NextValue();
  9. return (int)cpuCounter.NextValue();
  10. }
  11. }`

但 PerformanceCounter 在.NETCore 中是没有的,所以只能采用其他方式了,其实在 System.Diagnostics.Process 类中有一个 TotalProcessorTime 属性,它可以准实时的统计当前进程所消耗的CPU处理器时间,

如下代码:
`class Program
{
public static async Task Main(string[] args)
{
var task = Task.Run(() => ConsumeCPU(50));

  1. while (true)
  2. {
  3. await Task.Delay(2000);
  4. var cpuUsage = await GetCpuUsageForProcess();
  5. Console.WriteLine(cpuUsage);
  6. }
  7. }
  8. public static void ConsumeCPU(int percentage)
  9. {
  10. Stopwatch watch = new Stopwatch();
  11. watch.Start();
  12. while (true)
  13. {
  14. if (watch.ElapsedMilliseconds > percentage)
  15. {
  16. Thread.Sleep(100 - percentage);
  17. watch.Reset();
  18. watch.Start();
  19. }
  20. }
  21. }
  22. private static async Task<double> GetCpuUsageForProcess()
  23. {
  24. var startTime = DateTime.UtcNow;
  25. var startCpuUsage = Process.GetCurrentProcess().TotalProcessorTime;
  26. await Task.Delay(500);
  27. var endTime = DateTime.UtcNow;
  28. var endCpuUsage = Process.GetCurrentProcess().TotalProcessorTime;
  29. var cpuUsedMs = (endCpuUsage - startCpuUsage).TotalMilliseconds;
  30. var totalMsPassed = (endTime - startTime).TotalMilliseconds;
  31. var cpuUsageTotal = cpuUsedMs / (Environment.ProcessorCount * totalMsPassed);
  32. return cpuUsageTotal * 100;
  33. }
  34. }`

在NET Core 中获取 CPU 使用率
可以看到程序每2s输出一次,观察到 output 和 任务管理器 中的CPU利用率基本是一致的。