使用Process Class c#列出进程内存和CPU使用率时出现问题

时间:2011-04-28 20:11:06

标签: c# memory process cpu

我遇到了在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 + "");
}

3 个答案:

答案 0 :(得分: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");
    }
}

答案 1 :(得分:3)

Process.PeakWorkingSet64返回的字节数不是KB,因此可能是132203KB或​​129MB这听起来更合理吗?

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

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

答案 2 :(得分:0)

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

如果您使用的是visual studio,请打开visual studio作为管理员模式。 或以管理员模式运行程序。