在使用进程类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 + "");
}
流程。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。