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

本文关键字:进程 用情 CPU 情况 存在 问题 内存 | 更新日期: 2023-09-27 17:53:54

我在列出c#中进程的内存和CPU使用情况时遇到问题。当我试图获得TotalProcessorTime时,我得到一个运行时错误"拒绝访问"。

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

是否有更好的方法获得内存使用?我的目标是显示它像任务管理器像1024K。

至于CPU使用情况,我尝试在管理员权限下运行我的编译器(VS2010专业版),我在管理员帐户上,但我得到了同样的错误。此外,我正在运行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#列出进程内存和CPU使用情况时存在问题

流程。PeakWorkingSet64返回字节数而不是KB,因此可能是132203KB或129MB,这听起来更合理吗?

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

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

大多数读数通常以字节为单位,而不是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");
    }
}

以管理员模式运行应用程序,这样它就不会显示任何关于Access denied消息。

如果您正在使用visual studio,那么以管理员模式打开visual studio。