我遇到了在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 + "");
}
答案 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作为管理员模式。 或以管理员模式运行程序。