循环为什么这么长而且慢?

时间:2014-06-10 03:57:11

标签: c# .net winforms

我为测试创建了一个新类:

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循环时它太慢并且需要很长时间。

有什么办法可以解决吗?

1 个答案:

答案 0 :(得分:0)

此:

foreach (Process process in processes)
{
    CpuUsages.cputest();
    cpuusage = CpuUsages.processes;
    label26.Text = cpuusage;
}

将使您的程序休眠1秒*(您计算机上运行的进程数)。难怪foreach循环很慢。

删除那些Sleep调用,让你的循环在另一个Thread中运行,避免降低用户界面的速度。

另外,我不明白为什么要对processes返回的Process.GetProcesses()进行迭代:您没有使用它们。