首先,你必须了解CPU使用率总是在一定时间内的平均值。在任何给定的时间,CPU是工作或不是。 CPU从不是40%工作。
然而,我们可以模拟一个40%的负载超过一秒,通过让CPU工作0.4秒,睡眠0.6秒。这使得平均利用率超过40%。
将其切割到小于一秒,例如100毫秒的块应当给予甚至更稳定的利用。
以下方法将采用所需利用率的参数,然后在一定程度上利用单个CPU /内核:
public static void ConsumeCPU(int percentage)
{
if (percentage < 0 || percentage > 100)
throw new ArgumentException("percentage");
Stopwatch watch = new Stopwatch();
watch.Start();
while (true)
{
// Make the loop go on for "percentage" milliseconds then sleep the
// remaining percentage milliseconds. So 40% utilization means work 40ms and sleep 60ms
if (watch.ElapsedMilliseconds > percentage)
{
Thread.Sleep(100 - percentage);
watch.Reset();
watch.Start();
}
}
}
我在这里使用一个stopwatch,因为它比TickCount的属性更准确,但你也可以使用它,并使用减法来检查你是否已经运行足够长。
有两件事要记住:
>在多核系统上,您将必须为每个核心生成一个线程。否则,您将看到只有一个CPU /内核被执行,给出大致“百分比/内核数”利用率。
> Thread.Sleep不是很准确。它永远不会保证时间精确到毫秒,所以你会看到一些变化的结果
要回答第二个问题,关于在一定时间后更改利用率,我建议您在一个或多个线程(取决于核心数量)运行此方法,然后当你想改变利用率,你只是停止那些线程和产生新的与新的百分比值。这样,你不必实现线程通信来改变正在运行的线程的百分比。