我为测试创建了一个新类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenHardwareMonitor.Hardware;
using System.Diagnostics;
using DannyGeneral;
using System.Windows.Forms;
using System.Threading;
using System.Management;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
namespace HardwareMonitoring
{
class CpuUsages
{
public static string processes;
public static string cputest()
{
PerformanceCounter cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";
var unused = cpuCounter.NextValue(); // first call will always return 0
System.Threading.Thread.Sleep(1000); // wait a second, then try again
//Console.WriteLine("Cpu usage: " + cpuCounter.NextValue() + "%");
processes = "Cpu usage: " + cpuCounter.NextValue() + "%";
return processes;
}
}
}
然后在form1中我添加了一个新的计时器设置为1000毫秒,在运行程序时启用它,并在我做的计时器刻度事件中:
private void timer3_Tick(object sender, EventArgs e)
{
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
CpuUsages.cputest();
cpuusage = CpuUsages.processes;
label26.Text = cpuusage;
}
}
这种方式工作非常慢,需要很长时间才能完成循环操作。 一般来说,我想循环遍历每个正在运行的进程并获得它的cpuusage。
但是如果我像这样删除foreach循环:
private void timer3_Tick(object sender, EventArgs e)
{
Process[] processes = Process.GetProcesses();
CpuUsages.cputest();
cpuusage = CpuUsages.processes;
label26.Text = cpuusage;
}
然后它将快速工作我将在label26中看到cpuusage更新eavery秒。 问题是它只会在进程中显示cpuusage。
我能做些什么来解决它? 通常,我想为列表中的每个进程创建自动标签数量,并显示每个进程cpuusage。但是当我使用foreach循环时它太慢并且需要很长时间。
有什么办法可以解决吗?
答案 0 :(得分:0)
此:
foreach (Process process in processes)
{
CpuUsages.cputest();
cpuusage = CpuUsages.processes;
label26.Text = cpuusage;
}
将使您的程序休眠1秒*(您计算机上运行的进程数)。难怪foreach
循环很慢。
删除那些Sleep
调用,让你的循环在另一个Thread中运行,避免降低用户界面的速度。
另外,我不明白为什么要对processes
返回的Process.GetProcesses()
进行迭代:您没有使用它们。