Будет ли более эффективным просмотр файла на наличие изменений или избыточный запрос этого файла?

Мне интересно, является ли просмотр файла/каталога изменений с использованием класса FileSystemWatcher чрезвычайно интенсивным по памяти. Я разрабатываю настольное приложение на С#, которое будет постоянно работать за кулисами на низкопроизводительных компьютерах, и мне нужен какой-то способ проверить, не изменились ли различные файлы. Я могу придумать несколько решений:

  1. Смотрите каталоги с помощью FileSystemWatcher.
  2. Запустите временный поток на интервале, который проходит, и вручную проверяет это.
  3. Проверяйте вручную каждый раз, когда запускается поток обработчика действий (программа иногда что-то делает с действием).

Какие-либо предложения?

Спасибо!

плохая панда


person badpanda    schedule 08.06.2010    source источник
comment
Дополнение: необходимо свести к минимуму как базовую (хотя и не так много) загрузку ресурсов, так и пиковую загрузку ресурсов.   -  person badpanda    schedule 09.06.2010


Ответы (5)


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

person Kevin Le - Khnle    schedule 08.06.2010
comment
Верно, но не забывайте, что некоторые события могут проскальзывать при использовании FileSystemWatcher (см. msdn.microsoft.com/en-us/library/: если за короткое время вносится много изменений, буфер может переполниться). Если вы хотите быть уверены, что ничего не пропустите, вам придется провести дополнительный опрос (с низкой скоростью). - person Dirk Vollmar; 09.06.2010
comment
Также обратите внимание, что НЕЛЬЗЯ избежать этого поведения переполнения в вашем коде; это буфер, который никак не связан со свойствами созданного вами FileSystemWatcher. Большое количество изменений за короткий промежуток времени (мы видели всего лишь 150 вставок/копий файлов) приведут к пропущенным событиям без уведомления о пропущенных событиях. - person Joe; 09.06.2010
comment
Хм. Я знаю о проблеме переполнения буфера и не беспокоюсь по двум причинам: первая заключается в том, что вероятность более чем 150 изменений в этом каталоге очень мала (я бы сказал, что это сценарий раз в год). Во-вторых, я написал код, чтобы просто знать, что произошло изменение; в любом случае требуется дополнительная фильтрация результатов, поэтому, пока обрабатывается переполнение буфера, я не думаю, что это будет проблемой. - person badpanda; 10.06.2010
comment
*вероятность более 150 изменений между вызовами обработчика OnChange очень мала. - person badpanda; 10.06.2010
comment
@badpanda: я думаю, что переполнение буфера - это экстремальный сценарий. У нас никогда не было ничего даже отдаленно близкого к такому экстремальному, и похоже, что и у вас тоже. - person Kevin Le - Khnle; 10.06.2010
comment
Конечно. Кроме того, для моих целей я могу просто перехватить все исключения, возникающие из этого блока кода, предположить, что если оно есть, то это переполнение буфера (я не могу предвидеть никаких других), и все равно выполнить свою задачу, поскольку в этом нет необходимости. чтобы я знал, какие файлы изменились. - person badpanda; 11.06.2010

Я использовал класс FileSystemWatcher для просмотра изменений файлов *.txt в сотнях каталогов без проблем с производительностью. Так что я думаю, что это лучшее решение.

person Max    schedule 08.06.2010

Вы хотите использовать FileSystemWatcher. Это то, для чего предназначен этот объект. Он был разработан и испытан для широкого использования. Все, что вы напишете, не пройдет проверку и оптимизацию, которые у него есть. Нет причин заново изобретать велосипед, если в этом нет необходимости.

person kemiller2002    schedule 08.06.2010
comment
За исключением того, что FileSystemWatcher не всегда работает, и его нельзя избежать: social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/ - person Joe; 09.06.2010

В крупномасштабном проекте передачи файлов, над которым я работаю в настоящее время (по всей стране), FileSystemWatcher был односторонним вариантом (с некоторым управлением блокировками файлов, очередями событий и т. д.). У вас так много преимуществ при использовании базовых конструкций ОС (обеспечивающих все это взаимодействие на основе событий), что я не думаю, что в противном случае вы добьетесь такого эффективного поведения.

person Aggelos Biboudis    schedule 08.06.2010

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

  1. Обычно ваша программа неактивна (т. е. находится в состоянии, когда нет необходимости знать об изменениях в файлах) в течение длительных периодов времени.
  2. Изменение файла/каталога во время работы программы маловероятно (за исключением самой программы, которая не требует уведомления).
  3. Вас интересует только небольшое количество файлов.

Тем не менее, FileSystemWatcher подходит даже в этом случае.

person Brian    schedule 08.06.2010