我主要按照这个帖子的第二个答案中讨论的内容。我想运行一个程序,它将持续检查CPU使用率超过5%,持续10秒,并在每次发生时提醒我。
How to get the CPU Usage in C#?
我的代码如下:
static void Main(string[] args)
{
Console.WriteLine("Checking for CPU usage");
int totalhits = 0;
float cpuPercent = getCPUValue();
while (true)
{
if (cpuPercent >= 5)
{
totalhits += 1;
if (totalhits == 10)
{
Console.WriteLine("Alert Usage has exceeded");
Console.WriteLine("Press Enter to continue");
Console.ReadLine();
totalhits = 0;
}
}
else
{
totalhits = 0;
}
}
}
private static float getCPUValue()
{
PerformanceCounter cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor time";
cpuCounter.InstanceName = "_Total";
float firstValue = cpuCounter.NextValue();
System.Threading.Thread.Sleep(50);
float secondValue = cpuCounter.NextValue();
return secondValue;
}
我的问题是它永远不会达到那个阈值,如果我取出totalhits = 0;在最里面的if语句中的语句然后它在不到5秒的时间内达到阈值。
我做错了什么?
答案 0 :(得分:1)
首先
float cpuPercent = getCPUValue();
行应该在循环内部。否则,您只会读取一次CPU使用率。并将迭代相同的值。
您应该只创建一个PerformanceCounter对象,并在循环内反复调用cpuCounter.NextValue()。 不要在每次迭代中创建相同的CPU PerformanceCounter。
PerformanceCounter counter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
while (true)
{
float cpuPercent = counter.nextValue();
if (cpuPercent >= 5)
{
totalhits += 1;
if (totalhits == 10)
{
Console.WriteLine("Alert Usage has exceeded");
Console.WriteLine("Press Enter to continue");
Console.ReadLine();
totalhits = 0;
}
}
else
{
totalhits = 0;
}
}
如MSDN
中所述要获取需要初始值或上一个值来执行必要计算的计数器的性能数据,请调用NextValue方法两次,并使用您应用程序所需返回的信息。
所以你应该调用cpuCounter.NextValue()两次(调用之间有大约1秒的延迟)来开始获得正确的CPU使用率结果。
BTW,您应该在CPU PerformanceCounter的每次读取操作之间等待大约1秒钟(以确保更新)。
所示答案 1 :(得分:0)
使用下面msdn中所述的 DispatcherTimer ,并根据需要获得结果。