为了账号安全,请及时绑定邮箱和手机立即绑定

尝试从性能监视器中提取 CPU 和网络使用信息

尝试从性能监视器中提取 CPU 和网络使用信息

C#
一只名叫tom的猫 2021-08-07 17:37:43
我正在尝试从进程中获取 CPU 和网络使用信息。在我的示例中,我将使用该过程chrome这是我如何使用IEnumerable<String>foreach (string p in GetProcessStatistics(new string[] { "chrome" })){  Console.WriteLine(p);}这是方法。    private static IEnumerable<String> GetProcessStatistics(String[] processesTosearch)    {        Process[] processList = Process.GetProcesses();        foreach (string process in processesTosearch)        {            foreach (Process p in processList)            {                if (p.ProcessName == process)                {                    StringBuilder sb = new StringBuilder();                    PerformanceCounter CPUperformanceCounter = new PerformanceCounter("Process", "% Processor Time", p.ProcessName);                    double cpuData = CPUperformanceCounter.NextValue();                    PerformanceCounter NETWORKperformanceCounter = new PerformanceCounter("Process", "IO Data Operations/Sec", p.ProcessName);                    double networkData = NETWORKperformanceCounter.NextValue();                    sb.AppendLine("ID: " + p.Id.ToString());                    sb.AppendLine("NAME: " + p.ProcessName);                    sb.AppendLine("CPU USAGE: " + cpuData);                    sb.AppendLine("RAM USAGE: " + ConvertToReadableSize(p.PrivateMemorySize64));                    sb.AppendLine("NETWORK USAGE: " + networkData);                    yield return sb.ToString();                }            }        }    }这是其中一个结果的输出ID: 17624NAME: chromeCPU USAGE: 0RAM USAGE: 23.2MBNETWORK USAGE: 0当我查看性能监视器时,cpu 和网络值不是 0,但是在控制台中,它们是。我从一些研究中了解到这些值永远不会是完美的,但是为什么它们在控制台应用程序中而不是在性能监视器上显示为 0?
查看完整描述

2 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

我喜欢杰夫的解决方案,但对我来说,我想要一个平均值。获得 CPU 使用率的几个问题似乎应该有一个简单的程序包可以解决,但我没有看到。


第一个当然是第一个请求的值 0 是无用的。既然您已经知道第一个响应是 0,那么为什么函数不考虑这一点并返回 true .NextValue()?


第二个问题是,当试图决定你的应用程序可能有哪些资源可用时,瞬时读数可能非常不准确,因为它可能会出现峰值,或在峰值之间。


我的解决方案是做一个 for 循环,循环并为您提供过去几秒钟的平均值。您可以调整计数器以使其更短或更长(只要它大于 2)。


public static float ProcessorUtilization;


public static float GetAverageCPU()

{

    PerformanceCounter cpuCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName);

    for (int i = 0; i < 11; ++i)

    {

        ProcessorUtilization += (cpuCounter.NextValue() / Environment.ProcessorCount);

    }

    // Remember the first value is 0, so we don't want to average that in.

    Console.Writeline(ProcessorUtilization / 10); 

    return ProcessorUtilization / 10;

}


查看完整回答
反对 回复 2021-08-07
  • 2 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信