c# - 并行获取所有进程

标签 c# windows task-parallel-library

我正在尝试使用 C# 的 TPL 并行获取所有进程的 CPU%。我的代码是:

        private IDictionary<Process, int> _usage = new Dictionary<Process, int>();

        public ProcessCpuUsageGetter()
        {            
            Process[] processes = Process.GetProcesses();
            int processCount = processes.Count();
            Task[] tasks = new Task[processCount];

            int counter = 0;
            for (int i = 0; i < processCount; i++)
            {
                tasks[i] = Task.Factory.StartNew(() => DoWork(processes[i]));
            }

            Task.WaitAll(tasks);
        }

        private void DoWork(object o)
        {
            Process process = (Process)o;
            PerformanceCounter pc = new PerformanceCounter("Process", "% Processor Time", process.ProcessName, true);
            pc.NextValue();
            Thread.Sleep(1000);
            int cpuPercent = (int)pc.NextValue() / Environment.ProcessorCount;
            _usage.Add(process, cpuPercent);
        }

但它失败了,已经添加了一个具有相同键的项目。关于我做错了什么的任何想法?

最佳答案

问题是局部变量i 在传递给启动任务的表达式时关闭。这会导致 DoWork(processes[i]) 使用 i 的当前值,即使 ifor 修改。

创建局部变量:

for (int i = 0; i < processCount; i++)
{
     int localI = i;
     tasks[i] = Task.Factory.StartNew(() => DoWork(processes[localI]));
}

关于c# - 并行获取所有进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5909776/

相关文章:

java - 在第二个驱动器上安装 JDK

c# - 具有 BoundedCapacity 的 BufferBlock 和 ActionBlock 不使用最大 DOP

c# - Metro C# 中的虚拟异步方法

c# - 使用 OpenXML SDK 将包含注释的幻灯片从一个 PowerPoint 演示文稿复制到另一个演示文稿

python - 通过 Python winreg 在注册表中设置 Windows 系统 PATH

c# - 在 SQL 查询中传递 DECLARE 参数

windows - 告诉 Puppet 仅在注册表项不存在时运行安装

c# - 使用 WhenAll 和 ContinueWith 时任务结果的顺序是什么

c# - 在自定义模拟类中创建返回 IDisposable 的方法

c# - 强制变量只保存某些值