2010-11-18 1 views
3

Недавно я создал службу, использующую один поток для периодической обработки информации. Служба была создана с использованием Microsoft Visual Studio 2010 Express. Я заметил, что загрузка процессора взлетела на Луну (загрузка процессора на 100%).Использование CPU становится очень высоким во время выполнения

Позже, из любопытства, я построил очень маленькую программу, в которой все, что она делает, запускает небольшую нить или таймер, а затем запускает невероятно длинный цикл. Я также переключился с создания консольного приложения на приложение Windows Form. Я смог уменьшить свою проблему, переключив тип программы на сборку.

Я попытался понижая приоритет потока:

System.Threading.Thread.CurrentThread.Priority = ThreadPriority.Lowest; 

Я также попытался установить класс приоритета

Process p = Process.GetCurrentProcess(); 
p.PriorityClass = ProcessPriorityClass.BelowNormal; 

Я также думал, что использование процессора, возможно, было высокая из-за работы на виртуальной машине. Но эта теория никуда меня не привела. Это довольно смешно. Я не знаю, куда еще повернуть. Я не уверен, почему запуск таймера или потока отправил бы мое использование ЦП через потолок так же, как в .NET Framework. Я никогда не испытывал этого при создании COM-объектов. Есть ли у кого-нибудь яркие идеи о том, куда я могу обратиться?

Спасибо за ваше время заранее.

ответ

2

Если вы повторяетесь в своем потоке, это может привести к высокому использованию ЦП. Вы пытались добавить паузу к выполнению потока между циклами?

Thread.Sleep(1000); 
+0

The Thread.Sleep (1000) помог мне разобраться во всем. Реальная программа несколько сложна. Это часть очень маленькой программы, которую я написал: System.Threading.Thread th = new System.Threading.Thread (новый ThreadStart (ThreadFunc)); th.Priority = ThreadPriority.Lowest; th.Start(); public static void ThreadFunc() { System.Threading.Thread.Sleep (10000); или (long i = 0; i <1000000000; i ++) {} System.Threading.Thread.Sleep (10000); } –

+0

Целью исходной программы было обработку информации, но она должна выполняться часто (например, 1/2 часа или один час). Я вижу, что Планировщик Windows позволяет мне планировать задачу только так часто, как ежедневно. Я думал, что буду использовать поток, чтобы отслеживать расписание, но я начинаю понимать, что это не очень умно. Поэтому я открыт для предложений. –

+0

Я думаю, что я могу развернуться и использовать планировщик задач Windows вместо того, чтобы пытаться сделать что-то свое и использовать потоки и таймеры, чтобы моя программа была легкой. Спасибо, ребята, и хорошо выглядите. –

3

Звучит так, как будто ваш код зацикливается бесконечно и неожиданно.

Запустите его в отладчике Visual Studio, и когда вы увидите высокий центральный процессор, нажмите «Break», чтобы приостановить выполнение. Столбцы вызова и другое состояние программы, которое вы видите, когда вы это делаете, должны дать вам представление о том, что не так с вашей логикой.

Возможно, что просто выполнить код в отладчике будет быстрее. Это зависит от того, насколько сложным является код.