猿问

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

我正在尝试从进程中获取 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: 17624

NAME: chrome

CPU USAGE: 0

RAM USAGE: 23.2MB

NETWORK USAGE: 0

当我查看性能监视器时,cpu 和网络值不是 0,但是在控制台中,它们是。


我从一些研究中了解到这些值永远不会是完美的,但是为什么它们在控制台应用程序中而不是在性能监视器上显示为 0?


一只名叫tom的猫
浏览 202回答 2
2回答

噜噜哒

我喜欢杰夫的解决方案,但对我来说,我想要一个平均值。获得 CPU 使用率的几个问题似乎应该有一个简单的程序包可以解决,但我没有看到。第一个当然是第一个请求的值 0 是无用的。既然您已经知道第一个响应是 0,那么为什么函数不考虑这一点并返回 true .NextValue()?第二个问题是,当试图决定你的应用程序可能有哪些资源可用时,瞬时读数可能非常不准确,因为它可能会出现峰值,或在峰值之间。我的解决方案是做一个 for 循环,循环并为您提供过去几秒钟的平均值。您可以调整计数器以使其更短或更长(只要它大于 2)。public static float ProcessorUtilization;public static float GetAverageCPU(){&nbsp; &nbsp; PerformanceCounter cpuCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName);&nbsp; &nbsp; for (int i = 0; i < 11; ++i)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; ProcessorUtilization += (cpuCounter.NextValue() / Environment.ProcessorCount);&nbsp; &nbsp; }&nbsp; &nbsp; // Remember the first value is 0, so we don't want to average that in.&nbsp; &nbsp; Console.Writeline(ProcessorUtilization / 10);&nbsp;&nbsp; &nbsp; return ProcessorUtilization / 10;}
随时随地看视频慕课网APP
我要回答