【问题标题】:Having issues listing process memory and CPU usage using Process Class c#使用 Process Class c# 列出进程内存和 CPU 使用率时出现问题
【发布时间】:2011-04-28 20:11:06
【问题描述】:

我在列出 C# 中进程的内存和 CPU 使用情况时遇到问题。我在尝试获取 TotalProcessorTime 时收到运行时错误“拒绝访问”。

另外,当我使用PeakWorkingSet64 时,我得到了不合理的数字。例如,我知道 steam.exe 不占用 135380992 KB。

有没有更好的方法来获取内存使用情况?我的目标是像任务管理器一样显示它,比如 1024K。

至于 CPU 使用率,我尝试在管理员权限下运行我的编译器(VS2010 Professional),并且我使用的是管理员帐户,但我得到了同样的错误。如果这与此事有关,我也正在运行 Windows 32 位。谢谢!

var processes = Process.GetProcesses();
listBox1.Items.Clear();
foreach (var process in processes)
{                
    listBox2.Items.Add(process.PeakWorkingSet64 + process.ProcessName + "");
    listBox3.Items.Add(process.TotalProcessorTime + "");
}

【问题讨论】:

    标签: c# memory process cpu


    【解决方案1】:

    大多数读数通常以字节为单位,而不是 KB。此外,由于权限和特权问题,直接使用 Process 类很困难。尝试改为读取性能计数器数据。这是一个示例函数,它转储所有进程的各种进程内存使用统计信息(它使用log4net 进行日志记录):

    public static void LogProcessMemoryUsage()
    {
        try
        {
            PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");
    
            string[] instanceNames = cat.GetInstanceNames();
    
            foreach (string name in instanceNames)
            {
                try
                {
                    PerformanceCounter counter = new PerformanceCounter("Process", "Private Bytes", name, true);
                    PerformanceCounter setCounter = new PerformanceCounter("Process", "Working Set", name, true);
                    PerformanceCounter poolNPCounter = new PerformanceCounter("Process", "Pool Nonpaged Bytes", name, true);
    
                    log.InfoFormat("Memory usage for process [{0}]", name);
                    log.InfoFormat("\tMem Usage:       {0} KB", (setCounter.NextValue()/1024f));
                    log.InfoFormat("\tVM Size:         {0} KB", (counter.NextValue()/1024f));
                    log.InfoFormat("\tNon-Paged Pool:  {0} KB", (poolNPCounter.NextValue() / 1024f));
                }
                catch (Exception ex)
                {
                    log.InfoFormat("Could not read memory stats for process {0}", name);
                }
            }
        }
        catch(Exception ex2)
        {
            log.Info("Cannot retrieve memory performance counter statistics");
        }
    }
    

    【讨论】:

    • 您的回答也很棒,我不知道如何使用 log4net,所以我只是让控制台打印出效果也很好的信息!我希望我能接受两个答案。谢谢:)
    【解决方案2】:

    Process.PeakWorkingSet64 返回字节数而不是 KB,所以这可能是 132203KB 或 129MB,这听起来更合理吗?

    您是否尝试过在 VS 之外运行应用程序,以管理员身份运行它?可能是 VS 托管进程没有在提升的权限下运行,因此阻止您调用 TotalProcessorTime,我没有对此进行测试,所以我可能会偏离轨道。

    更新:我刚刚做了一个快速测试,似乎 TotalProcessorTime 属性实际上试图打开进程的句柄,即使作为管理员,您也可能没有足够的权限来执行某些进程.我建议你看看使用 windows PerformanceCounter 来获取你正在寻找的信息。

    【讨论】:

    • 你对字节不是 KB 是正确的,我转换了它,它几乎是完美的。谢谢!处理器问题仍然存在,当我从发布/调试文件夹运行它时,我得到了一个未经处理的异常。 :*(
    • @Shadowalker,我做了一个快速测试并用信息更新了我的答案。
    • 是的,我认为你是对的。我的目标是在这个上使用性能计数器。谢谢!
    • 是的,好主意 - (在他的回答中第一次提到它的人说;))
    【解决方案3】:

    以管理员模式运行应用程序,因此它不会显示任何有关拒绝访问的消息。

    如果您使用的是 Visual Studio,请以管理员模式打开 Visual Studio。 或以管理员模式运行程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多