Добрый день уважаемые гуру!
Помогите решить проблему или дайте дельный совет. Необходимо организовать передачу файлов из каталога в очередь MSMQ. Для этого создан сервис, который при старте запускает отдельный поток для просмотра содержимого каталога. После создания потока управление передается методу:
public void Test()
{
string ss = "";
DirectoryInfo dir = new DirectoryInfo(@"C:\temp");
while (abt == true)
{
FileInfo[] fil = dir.GetFiles();
foreach (FileInfo f in fil)
{
ss = f.Name;
}
}
}
И вот этот простенький пример грузит процессор на 97%-100%, это при том, что нет никакой дополнительной логики обработки.
Вопрос:
Как можно снизить нагрузку на процессор при опросе каталога?
Может я написал неверный алгоритм опроса?
А>public void Test() А> { А> string ss = ""; А> DirectoryInfo dir = new DirectoryInfo(@"C:\temp"); А> while (abt == true) А> { А> FileInfo[] fil = dir.GetFiles(); А> foreach (FileInfo f in fil) А> { А> ss = f.Name; А> } А> } А> } А>И вот этот простенький пример грузит процессор на 97%-100%, это при том, что нет никакой дополнительной логики обработки.
Вставь вызов sleep(1) после foreach...
Re[2]: Загрузка процессора при опросе каталога
От:
Аноним
Дата:
03.05.06 11:58
Оценка:
Здравствуйте, memorilik, Вы писали:
M>Вставь вызов sleep(1) после foreach...
Здравствуйте, <Аноним>, Вы писали:
А>Я так понимаю, что таким образом можно отследить изменения в каталоге. А как быть если в момент запуска сервиса в каталоге уже есть файлы?
Сначала обработать имеющиеся файлы. После этого отслеживать тзменеия с помощью FileSystemWatcher-а.
А>Я так понимаю, что таким образом можно отследить изменения в каталоге. А как быть если в момент запуска сервиса в каталоге уже есть файлы?
В момент запуска сервиса вы обрабатываете файлы из каталога 1 раз и всё. Дальше просто следите за каталогом, обрабатывая их по мере поступления.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Загрузка процессора при опросе каталога
От:
Аноним
Дата:
04.05.06 03:21
Оценка:
Здравствуйте, Othello, Вы писали:
O>В момент запуска сервиса вы обрабатываете файлы из каталога 1 раз и всё. Дальше просто следите за каталогом, обрабатывая их по мере поступления.
Спасибо за рекомендации, обязательно попробую данную технологию.
Ну а все таки, есть ли способ снизить загрузку процессора при использовании фрагмента кода указанного в самом начале переписки?
Здравствуйте, Аноним, Вы писали:
А>Ну а все таки, есть ли способ снизить загрузку процессора при использовании фрагмента кода указанного в самом начале переписки?
Там вообще бесконечный цикл написан.
Re[6]: Загрузка процессора при опросе каталога
От:
Аноним
Дата:
04.05.06 06:01
Оценка:
Здравствуйте, Mab, Вы писали:
Mab>Там вообще бесконечный цикл написан.
Ну и что? При старте сервиса запускается 5 потоков с бесконечными циклами выполняющими ту или иную функциональность. Они все вместе грузят систему на 02%. А вот при запуске цикла описанного в примере все становиться колом. Поэтому и хочется узнать в чем собственно дело, и как организовать опрос каталога с использованием GetFiles? Ожидается пополнение каталога до 50 000 сообщений в сутки. Если сейчас при холостом просмотре производиться такая нагрузка на проц, то что тогда будет при инициализации такого каталога и дополнительной логике, связанной с обработкой файлов?
Здравствуйте, <Аноним>, Вы писали:
А>Вопрос: А>Как можно снизить нагрузку на процессор при опросе каталога? А>Может я написал неверный алгоритм опроса?
Здравствуйте, Аноним, Вы писали:
А>Ну и что?
То, что написанный код с точки зрения нагрузки процессора эквивалентен
for (;;) ;
Надеюсь, тот факт, что здесь будет 100% загрузка, сомнений не вызывает?
Чтобы получить меньше, нужно принудительно отдавать кванты процессорного времени (yield). Делать это можно неявно, используя объекты синхронизации, или явно, вызывая Thread.Sleep.