2012-04-12 3 views
3

Отредактировано: Первоначально изложены два вопроса, они были проверены и получили ответ.C# предельная нить Использование ЦП

Я создаю многопоточный читатель/писатель, который просматривает файлы в наборе папок. Он делает это каждые 5 минут или меньше, если пользователь указывает его.

Моя текущая проблема заключается в том, что поток будет смотреть на файлы с слишком высокой прожорливостью. Я хочу ограничить поток использованием максимум 30% процессора (или указанной пользователем суммы, если они хотят быстрее или медленнее). Причина этого в том, что это программа, которая должна быть всегда включена, и я не хочу, чтобы она мешала им просматривать Интернет или использовать другие программы одновременно. Я лично отмечаю, что потоковые программы, использующие 100% винтов ЦП с другими программами, даже если они настроены на более низкий приоритет, и пытаюсь избежать этого.

Я думал об использовании PerformanceCounter для проверки использования ЦП, надеюсь, что он идентифицирует программу и добавит больше циклов сна, если производительность (всего процессора или моей программы в зависимости от того, что она находит) начинает пик , Я не нашел никакой документации по ограничению использования процессора потоков, кроме «lol, why bother?», «Не реально выполнимо» без каких-либо причин (что совершенно нормально - большинство людей хотят, чтобы поток был выполнен как можно скорее, и не может быть способ сделать это присущим .Net или другой библиотеке C#).

Кто-нибудь знает о другом, кроме того, он устанавливает приоритет ниже или добавляет дополнительные накладные расходы, используя PerformanceCounter/какой-либо другой монитор ЦП? Благодарю.

+2

Заканчивать [это] (http://stackoverflow.com/a/482622/884410) ответ –

+0

Вы уверены, что ваша проблема является использование процессора, а не диск I/O? –

+0

@MattBurland - yup - вот-вот опубликуйте это.Я только что делал «оптимальную глубину потока» для исследования задач, связанных с CPU. У меня были потоки 8/16/32/80/800, работающие на 4/8 ядрах на 100%, но, поскольку потоки пулов установлены в 'THREAD_PRIORITY_BELOW_NORMAL', мой браузер и т. Д. Все работало отлично. –

ответ

2

Я не уверен, как вы сейчас просматриваете папку, но я думаю, вы должны взглянуть на класс FileSystemWatcher (http://msdn.microsoft.com/en-us/library/system.io .filesystemwatcher.aspx).

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

+0

Спасибо, наверное, лучший ответ, но это цикл через базу данных папки/txt и будет файлом, просматривающим большое количество файлов и подфайлов. Если бы он смотрел слишком высоко, хорошо, у меня был бы тот же CPU, что и каждый X-время, как обычно. Если бы он смотрел слишком низко, то в конце концов их было бы миллион. – Charles

2

Не уверен, что я правильно понял вас. Вы проверяете файлы каждые 5 минут, и проверка (или их обработка) занимает слишком много времени процессора от других процессов?

Если да, то как замедлить его, приостановив промежуточную обработку (например, между файлами) с помощью Thread.Sleep?

Я действительно не думаю, что вам следует беспокоиться о максимальной загрузке процессора (плюс настройка этого может быть громоздкой или запутанной для пользователя, так как для многоядерных процессоров не всегда ясно, что на самом деле 100% -ный процессор, это 100 % на одно ядро ​​или всего 100%?).

Время паузы/сна может зависеть от количества пройденного времени и количества оставшегося времени, чтобы сделать другие вещи, например. вы можете зарезервировать 10 мс на файл; если обработка заняла 4 мс, вы спите 6 мс.

Если вы постоянно проверяете файлы для проверки, убедитесь, что вместо этого используйте FileSystemWatcher, что должно решить ваши проблемы в этом случае.

0

Загрузка процессора сама по себе не плоха, если вы не превысили максимальную нагрузку. Вы будете в порядке, просто снижая приоритет процесса. Если есть другие процессы с более высоким приоритетом, они будут приоритетными.

Process thisProc = Process.GetCurrentProcess(); 
    thisProc.PriorityClass = ProcessPriorityClass.BelowNormal; 
Смежные вопросы