Я разрабатываю программу на C#, и у меня есть одна функция, которая потребляет слишком много ресурсов процессора. Я хотел бы знать способ контролировать это с помощью кода (не с помощью какого-либо внешнего приложения) и ограничивать процент использования ЦП. Например, если оно использует 90% использования ЦП, чтобы мое приложение потребляло только 20%, даже если оно становится медленнее. Это должно быть сделано автоматически и из приложения. Если вы предоставите класс, это будет здорово.
Это может быть костыль, но я могу придумать несколько приложений для этой идеи, таких как: фоновая задача с привязкой к ЦП для вычисления чисел, узел в распределенной вычислительной среде офисных ПК, программа искусственного интеллекта для мониторинга и обучения на основе моего использования привычки.
Чтобы ограничить использование ЦП на уровне 50%, запустите его на двухъядерном процессоре; для ограничения 25% запустите его на четырехъядерном процессоре: D
Моя идея похожа на идею Брайана Энсинка: иметь приложение, работающее в фоновом режиме, но ограничение - это способ потребления циклов. Очень забавная идея, что у четырехъядерных процессоров
@Coehorn: Атака на симптом может показаться костылем, но, безусловно, так работает большинство докторов медицины и большая часть фармацевтической промышленности (хотя и не имеет отношения к программированию).





Я не знаю, можете ли вы это сделать, но вы можете изменить приоритет потока выполняющегося потока через свойство Приоритет. Вы бы установили это:
Thread.CurrentThread.Priority = ThreadPriority.Lowest;
Кроме того, я не думаю, что вы действительно хотите ограничить это. Если машина в противном случае простаивает, вы бы хотели, чтобы она занялась этой задачей, верно? ThreadPriority помогает сообщить об этом планировщику.
Некоторым это поможет, и это единственный известный мне способ сделать это.
Я видел, как приложения для Windows могут точно ограничивать себя ... скажем, 50% ЦП. Частота ошибок была менее 1%.
И в чем именно преимущество точного укупорки? Циклы холостого хода тратятся зря.
Вы можете замедлить цикл, вызвав Thread.Sleep (миллисекунды) внутри цикла. Это возвращает CPU планировщику.
Но «использование слишком большого количества процессора» заставляет меня думать, что у вас могут быть более фундаментальные проблемы. Этот поток опрашивает и ждет чего-то еще? Если это так, вам следует рассмотреть возможность использования событий или какого-либо другого механизма сигнализации на основе ядра.
Я предполагаю, что вам нужно запросить какой-то API ОС, чтобы узнать, сколько процессора вы потребляете, и с этого момента принять решения о дросселировании (например, Thread.Sleep).
Это похоже на костыль: атаковать симптом, а не проблему. Почему бы вам не опубликовать информацию о том, что метод пытается сделать, и не попросить нас о помощи в его оптимизации.