
这篇文章我们分享一种如何在 .NETCore 中获取 CPU使用率的方法, 它所报告的这个值和 任务管理器 中报告的 CPU 使用值 差不多是一致的。
在 .NET Framework 中,很多人会用 PerformanceCounter 类做这件事情,参考如下代码:
- publicclassProgram
- {
- publicstaticvoidMain(string[]args)
- {
- while(true)
- {
- varcpuUsage=GetCpuUsageForProcess();
- Console.WriteLine(cpuUsage);
- }
- }
- privatestaticintGetCpuUsageForProcess()
- {
- varcurrentProcessName=Process.GetCurrentProcess().ProcessName;
- varcpuCounter=newPerformanceCounter("Process","%ProcessorTime",currentProcessName);
- cpuCounter.NextValue();
- return(int)cpuCounter.NextValue();
- }
- }
但 PerformanceCounter 在 .NETCore 中是没有的,所以只能采用其他方式了,其实在 System.Diagnostics.Process 类中有一个 TotalProcessorTime 属性,它可以准实时的统计当前进程所消耗的CPU处理器时间,参考如下代码:
- classProgram
- {
- publicstaticasyncTaskMain(string[]args)
- {
- vartask=Task.Run(()=>ConsumeCPU(50));
- while(true)
- {
- awaitTask.Delay(2000);
- varcpuUsage=awaitGetCpuUsageForProcess();
- Console.WriteLine(cpuUsage);
- }
- }
- publicstaticvoidConsumeCPU(intpercentage)
- {
- Stopwatchwatch=newStopwatch();
- watch.Start();
- while(true)
- {
- if(watch.ElapsedMilliseconds>percentage)
- {
- Thread.Sleep(100-percentage);
- watch.Reset();
- watch.Start();
- }
- }
- }
- privatestaticasyncTask<double>GetCpuUsageForProcess()
- {
- varstartTime=DateTime.UtcNow;
- varstartCpuUsage=Process.GetCurrentProcess().TotalProcessorTime;
- awaitTask.Delay(500);
- varendTime=DateTime.UtcNow;
- varendCpuUsage=Process.GetCurrentProcess().TotalProcessorTime;
- varcpuUsedMs=(endCpuUsage-startCpuUsage).TotalMilliseconds;
- vartotalMsPassed=(endTime-startTime).TotalMilliseconds;
- varcpuUsageTotal=cpuUsedMs/(Environment.ProcessorCount*totalMsPassed);
- returncpuUsageTotal*100;
- }
- }

可以看到程序每2s输出一次,观察到 output 和 任务管理器 中的CPU利用率基本是一致的。
译文链接:https://medium.com/@jackwild/getting-cpu-usage-in-net-core-7ef825831b8b
原文链接:https://mp.weixin.qq.com/s/MdL5HBcHgbo_3DMshc5Gfg








发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。