使用Process类c#列出进程内存和CPU使用情况时出现问题

3

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

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

是否有更好的方法来获取内存使用情况?我的目标是像任务管理器一样以1024K的形式显示。

至于CPU使用情况,我尝试以管理员权限运行我的编译器(VS2010专业版),而且我的账户是管理员账户,但我仍然遇到了相同的错误。另外我正在运行32位的Windows系统,如果这有任何关系的话。谢谢!

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

4
大多数读取通常以字节为单位,而不是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,所以我只是让控制台输出信息,这也非常有效!但我真希望我可以接受两个答案。谢谢 :) - llk

4

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

你尝试过在VS之外运行应用程序,以管理员身份运行吗?可能是因为VS托管进程没有在提升的权限下运行,从而阻止你调用TotalProcessorTime,我没有测试过,所以我可能偏离了轨道。

更新: 我刚刚进行了快速测试,发现TotalProcessorTime属性实际上尝试打开一个处理进程的句柄,即使作为管理员,你对于某些进程可能没有足够的权限来执行此操作。我建议你查看使用Windows PerformanceCounter 来获取你要查找的信息。


你说的是对的,应该用字节而不是千字节,我转换过来后几乎完美了。谢谢!但处理器的问题还存在,当我从发布/调试文件夹中运行它时,会出现未处理的异常。 :*( - llk
@Shadowalker,我进行了快速测试,并更新了我的答案以包含这些信息。 - Chris Taylor
是的,我认为你说得对。我会尝试在这个上面使用性能计数器。谢谢! - llk
是的,很好的想法 -(这是第一个在他的答案中提到它的人;)) - Mike Marshall

0

以管理员模式运行应用程序,这样它就不会显示任何关于访问被拒绝的消息。

如果你正在使用 Visual Studio,则以管理员模式打开 Visual Studio。或者以管理员模式运行程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接