发布:2022/11/10 11:48:26作者:管理员 来源:本站 浏览次数:725
我试图弄清楚如何获取特定进程的CPU使用率,但只能找到与总体CPU使用率有关的信息。
有谁知道如何以百分比的形式提取特定应用程序的当前CPU使用率?
相关讨论
添加了一些有关基于PID查找实例的信息
性能计数器-进程-处理器时间百分比。
小样代码让您明白:
using System;
using System.Diagnostics;
using System.Threading;
namespace StackOverflow
{
class Program
{
static void Main(string[] args)
{
PerformanceCounter myAppCpu =
new PerformanceCounter(
"Process","% Processor Time","OUTLOOK", true);
Console.WriteLine("Press the any key to stop...\
");
while (!Console.KeyAvailable)
{
double pct = myAppCpu.NextValue();
Console.WriteLine("OUTLOOK'S CPU % =" + pct);
Thread.Sleep(250);
}
}
}
}
根据流程ID查找实例的注意事项:
我不知道有什么更好的方法,希望有人能做到。如果没有,这是在给定进程ID和进程名称的情况下为您的进程找到正确实例名称的一种方法。
在"Process"系列下还有一个称为"ID Process"的性能计数器(PC)。它返回实例的PID。因此,如果您已经知道名称(即" chrome"或" myapp"),则可以测试每个实例,直到找到PID的匹配项为止。
每个实例的命名都很简单:" myapp"," myapp#1"," myapp#2" ...等。
1
... new PerformanceCounter("Process","ID Process", appName, true);
一旦PC的值等于PID,就可以找到正确的appName。然后,您可以将该appName用于其他计数器。
相关讨论
您知道这是否适合处理进程ID或处理吗? 原因是因为可能正在运行多个进程,而我只想监视其中的一个特定进程。
在多核计算机上,您必须将性能计数器的值除以处理器(或内核)的数量。 pct = pct Environment.ProcessorCount。 否则,您可能会获得超过100%的值
第142天。仍在寻找任何钥匙。
我已经发布了答案,该答案结合了所有方法来检索RAM和CPU使用率的正确值。 包含代码。
一种不使用PerformanceCounter来计算单个进程的处理器使用率的方法。
using System;
using System.Diagnostics;
namespace cpuusage
{
class Program
{
private static DateTime lastTime;
private static TimeSpan lastTotalProcessorTime;
private static DateTime curTime;
private static TimeSpan curTotalProcessorTime;
static void Main(string[] args)
{
string processName ="OUTLOOK";
Console.WriteLine("Press the any key to stop...\
");
while (!Console.KeyAvailable)
{
Process[] pp = Process.GetProcessesByName(processName);
if (pp.Length == 0)
{
Console.WriteLine(processName +" does not exist");
}
else
{
Process p = pp[0];
if (lastTime == null || lastTime == new DateTime())
{
lastTime = DateTime.Now;
lastTotalProcessorTime = p.TotalProcessorTime;
}
else
{
curTime = DateTime.Now;
curTotalProcessorTime = p.TotalProcessorTime;
double CPUUsage = (curTotalProcessorTime.TotalMilliseconds - lastTotalProcessorTime.TotalMilliseconds) / curTime.Subtract(lastTime).TotalMilliseconds / Convert.ToDouble(Environment.ProcessorCount);
Console.WriteLine("{0} CPU: {1:0.0}%",processName,CPUUsage * 100);
lastTime = curTime;
lastTotalProcessorTime = curTotalProcessorTime;
}
}
Thread.Sleep(250);
}
}
}
}
您可以循环浏览以选择哪个进程,或者如果您已经知道ID,则只需使用此命令而不是GetProcessesByName()
1
Process p = Process.GetProcessById(123);
我已经从几个答案中收集了信息(最明显的是这个答案),并提出了以下代码,这些代码能够基于Windows提供的性能计数器信息来获取有关当前进程的CPU和RAM使用情况的信息:
public object GetUsage()
{
// Getting information about current process
var process = Process.GetCurrentProcess();
// Preparing variable for application instance name
var name = string.Empty;
foreach (var instance in new PerformanceCounterCategory("Process").GetInstanceNames())
{
if (instance.StartsWith(process.ProcessName))
{
using (var processId = new PerformanceCounter("Process","ID Process", instance, true))
{
if (process.Id == (int)processId.RawValue)
{
name = instance;
break;
}
}
}
}
var cpu = new PerformanceCounter("Process","% Processor Time", name, true);
var ram = new PerformanceCounter("Process","Private Bytes", name, true);
// Getting first initial values
cpu.NextValue();
ram.NextValue();
// Creating delay to get correct values of CPU usage during next query
Thread.Sleep(500);
dynamic result = new ExpandoObject();
// If system has multiple cores, that should be taken into account
result.CPU = Math.Round(cpu.NextValue() / Environment.ProcessorCount, 2);
// Returns number of MB consumed by application
result.RAM = Math.Round(ram.NextValue() / 1024 / 1024, 2);
return result;
}
确定实例名称时没有任何骇人听闻或猜测,我还要注意多个内核。
检索到的信息与我在VS中的流程浏览器和性能窗口中看到的信息一致。
相关讨论
嗨@shytikov非常有用的示例,然后尝试。 但是我可以在该方法之前放在哪里? 之后的方法? 提前致谢!
PerformanceCounter ProcessCPUCounter = new PerformanceCounter();
ProcessCPUCounter.CategoryName ="Process";
ProcessCPUCounter.CounterName ="% Processor Time";
ProcessCPUCounter.InstanceName ="TestServiceName";
ProcessCPUCounter.ReadOnly = true;
t3 = new Timer();
t3.Tick += new EventHandler(ProcessCPUThread); // Everytime t3 ticks, th2_Tick will be called
t3.Interval = (1000) * (1); // Timer will tick evert second
t3.Enabled = true; // Enable the t3
t3.Start();
private void ProcessCPUThread(object sender, EventArgs e)
{
try
{
Int32 processCPU = Convert.ToInt32( ProcessCPUCounter.NextValue());
tbCPUperPrcocess.Text = Convert.ToString(processCPU / Environment.ProcessorCount);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4