Прежде всего, вы должны понимать, что загрузка процессора всегда является средней за определенное время. В любой момент времени процессор либо работает, либо нет. Процессор никогда не работает на 40%.
Тем не менее, мы можем смоделировать 40% -ную нагрузку в течение, скажем, секунды, если процессор будет работать в течение 0,4 секунды и спать 0,6 секунды. Это дает среднее использование в 40% за эту секунду.
Сокращение до менее чем одной секунды, скажем, 100-миллисекундные порции должны обеспечить еще более стабильное использование.
Следующий метод будет принимать аргумент, который является желаемым использованием, а затем использовать один процессор / ядро до такой степени:
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();
}
}
}
Я использую секундомер здесь, потому что он более точен, чем свойство TickCount , но вы также можете использовать это и использовать вычитание, чтобы проверить, долго ли вы работаете довольно.
Следует помнить две вещи:
- в многоядерных системах вам придется создавать один поток для каждого ядра. В противном случае вы увидите, что задействуется только один процессор / ядро, дающее примерно процент использования / количества ядер.
- Тема. Сон не очень точный. Это никогда не будет гарантировать точное время с точностью до миллисекунды, поэтому вы увидите некоторые изменения в результатах
Чтобы ответить на ваш второй вопрос, касающийся изменения использования через определенное время, я предлагаю вам запустить этот метод в одном или нескольких потоках (в зависимости от количества ядер), а затем, когда вы захотите изменить использование, просто остановите эти потоки и порождают новые с новыми процентными значениями. Таким образом, вам не нужно реализовывать связь между потоками, чтобы изменить percentage
работающего потока.