2011-01-01 2 views
0

im создать приложение для Windows C#, как диспетчер загрузки при запуске этого приложения, я нашел, что процессор составляет 99%, и я пишу threading , как я могу начать решать эту проблему.CPU составляет 99% при написании приложения для потоковой передачи

благодарит вас

+2

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

+3

@ Давид - я считаю, что Ник Крейвер читает умы, но он, похоже, пока не вокруг. – Oded

+0

Начните с рассмотрения диспетчера задач. Действительно ли это приложение, которое использует процессор? Если да, попробуйте добавить в приложение какое-то заявление о регистрации, чтобы увидеть, какая часть застряла в цикле. Попробуйте и изолируйте ту часть приложения, у которой есть проблема, а затем вы можете ее решить. –

ответ

3

Ищите любые плотные петли, которые у вас есть в коде - это почти наверняка связано с одним из них. Что-то вроде этого:

while (!finished) 
{ 
    progressBar.Value = DownloadProgress; 
} 

Не смотря на ваш код, трудно угадать более точно.

2

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

+0

Я использовал индикатор выполнения, мой be progress bar - проблема –

+0

Я часто ошибался, когда принимал горло с производительностью; поэтому так важно использовать профилировщик. –

0

Да, профилирование - хорошая идея. Использовать, например. Red Gate ANTS Performance Profiler, который можно протестировать на 14 дней.

0

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

http://www.albahari.com/threading/

0

Я хотел бы попробовать с Jons ответ, а затем реализовать МУЭК ответ.

У вас есть плотные петли где-то в вашем коде. Несмотря на низкий приоритет (если вы его использовали) - если у вас есть цикл, который не освобождает элемент управления от планировщика потоков ядра, он будет потреблять весь процессор до тех пор, пока из него не будет выведено управление. Например, вы можете иметь:

while (!_shouldStop) 
{ 
    DoProcessing(); 
} 

Это действительно IS плохо, потому что это, конечно, использовать все свои CPU.

Чтобы решить эту проблему, проще всего использовать либо Sleep (100) или Sleep (0) внутри цикла, что-то вроде:

while (!_shouldStop) 
{ 
    DoProcessing(); 
    Thread.Sleep(0); 
} 

Есть также лучше (и как-то более сложные способы), чтобы сделать это - например, например, но для начала ваше приложение будет вести себя намного лучше с этим.

Смежные вопросы