gpt4 book ai didi

c# - 并行获取所有进程

转载 作者:可可西里 更新时间:2023-11-01 09:49:22 24 4
gpt4 key购买 nike

我正在尝试使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com