Program.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // See https://aka.ms/new-console-template for more information
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Threading;
  7. internal class Program
  8. {
  9. private static void Main(string[] args)
  10. {
  11. Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.AboveNormal;
  12. var counter = new PerformanceCounter("System", "Processor Queue Length", null);
  13. Console.WriteLine(counter.NextValue());
  14. //ShowCpuLoadByKernelIdleTime();
  15. }
  16. private static void ShowCpuLoadByKernelIdleTime()
  17. {
  18. var a = GetIdleKernelTime();
  19. if (a.HasValue == false)
  20. {
  21. Console.WriteLine("ERROR A");
  22. return;
  23. }
  24. Thread.Sleep(1000);
  25. var b = GetIdleKernelTime();
  26. if (b.HasValue == false)
  27. {
  28. Console.WriteLine("ERROR B");
  29. return;
  30. }
  31. var d = (b.Value - a.Value);
  32. var p = d / Environment.ProcessorCount;
  33. var i = d / 1000000000.0;
  34. Console.WriteLine($"{i * 100:N2}");
  35. }
  36. private static long? GetIdleKernelTime()
  37. {
  38. var outputs = RunCmd("wmic", "Process", "where", "ProcessId=0", "get", "KernelModeTime", "/value");
  39. var kv = outputs.FirstOrDefault(s => string.IsNullOrEmpty(s) == false);
  40. if (kv != null)
  41. {
  42. var kvs = kv.Split('=', 2);
  43. if (kvs.Length == 2 && long.TryParse(kvs[1], out var ns100)) return ns100;
  44. }
  45. return null;
  46. }
  47. private static IReadOnlyList<string> RunCmd(string filename, params string[] args)
  48. {
  49. var outputs = new List<string>();
  50. var p = new Process();
  51. p.StartInfo.FileName = filename;
  52. foreach (var s in args) p.StartInfo.ArgumentList.Add(s);
  53. p.StartInfo.RedirectStandardOutput = true;
  54. p.StartInfo.UseShellExecute = false;
  55. p.OutputDataReceived += (sender, eventArgs) => outputs.Add(eventArgs.Data);
  56. p.Start();
  57. p.BeginOutputReadLine();
  58. p.WaitForExit();
  59. return outputs;
  60. }
  61. }