Если увеличения размера буфера недостаточно, и вы не можете контролировать, сколько файлов запускают события за раз, вам придется добавить дополнительный опрос.
См. Также этот связанный вопрос:
Может быть заманчиво просто увеличить размер буфера, но это следует делать с осторожностью.На самом деле, ограничение доступа к сети составляет 64 КБ.Класс FileSystemWatcher
использует функцию Windows API ReadDirectoryChangesW
, которая имеет этот предел:
Если вы хотите глубже понять стоимость изменения размера буфера, вам следует взглянуть на статью Уолтера.Ван из Microsoft здесь:
FileSystemWatcher по сети (полный пост цитируется ниже)
Извините, что документацияFileSystemWatcher.InternalBufferSize не очень четко указывал размер буфера при мониторинге сетевого пути.При мониторинге сетевого пути рекомендуется не превышать 64 КБ.
FileSystemWatcher - это, по сути, оболочка .Net для Win32 ReadDirectoryChangesW API.Чтобы использовать ReadDirectoryChangesW, вы создаете и указываете буфер, который ОС будет заполнять изменениями.Однако то, что не упомянуто в документации ReadDirectoryChangesW (но намекается в документации FileSystemWatcher), заключается в том, что файловая система создает внутренний буфер ядра для временного хранения информации об изменениях, пока у нее не появится возможность обновить пользовательский буфер.Размер созданного буфера ядра совпадает с размером, указанным в ReadDirectoryChangesW, и создается в не пейджинговой объединенной памяти.Каждый раз, когда создается / вызывается FileSystemWatcher / ReadDirectoryChangesW, также создается новый буфер ядра.
Пулы памяти ядра (выгружаемые и не выгружаемые) выделяются в системном адресном пространстве для драйверов устройств и другого ядра.компоненты для использования.Они растут и сжимаются динамически по мере необходимости.Текущий размер пулов можно легко увидеть, перейдя на вкладку «Производительность» диспетчера задач.Пулы будут динамически расти, пока не достигнут максимального значения, которое рассчитывается во время загрузки и зависит от доступных системных ресурсов (в основном ОЗУ).Вы не хотите использовать это максимальное значение, иначе начнут выходить из строя различные системные службы и драйверы.Тем не менее, это рассчитанное максимальное значение не легко доступны.Чтобы определить максимальные размеры пула, вам нужно использовать отладчик ядра.Если вас интересует дополнительная информация о пулах системной памяти, я рекомендую вам взглянуть на главу 7 в книге MSPress «Внутри Windows 2000» Соломона и Руссиновича.
С учетом этого нетрекомендация о том, какой размер буфера вы можете использовать.Текущий и максимальный размер системных пулов будет варьироваться от клиента к клиенту.Однако вам, вероятно, не следует превышать 64 КБ для каждого буфера FileSystemWatcher / ReadDirectoryChangesW.Это связано с тем, что существует ограничение в 64 КБ с доступом к сети, как описано в ReadDirectoryChangesW.Но в конце вам придется протестировать приложение на различных ожидаемых целевых системах, чтобы вы могли настроить свой буфер.
С приложениями .Net связаны накладные расходы, и я полагаю, что программа Win32 ReadDirectoryChangesWможет быть в состоянии достичь лучшей производительности с тем же размером буфера.Однако при очень быстрых и многочисленных изменениях файлов переполнение буфера будет неизбежным, и разработчику придется обрабатывать случай, когда происходит переполнение, например, вручную перечислять каталог для обнаружения изменений.
В заключение,FileSystemWatcher и ReadDirectoryChangesW - это легкий механизм обнаружения изменений файлов, который будет иметь свои ограничения.Журналы изменений - это еще один механизм, который мы бы рассмотрели как решение среднего веса, но при этом у него все еще были бы ограничения:
http://msdn.microsoft.com/en-us/library/aa363798%28VS.85%29.aspx
Решения с большим весом означали бы написание специального драйвера фильтра файловой системы.который находится в стеке файловой системы и отслеживает изменения файловой системы.Конечно, это был бы самый сложный подход.В большинстве антивирусных сканеров, программ резервного копирования и утилит мониторинга файловой системы, таких как filemon (www.sysinternals.com), реализован драйвер фильтра.
Надеюсь, приведенное выше объяснение поможет вам понять причину проблемы, с которой вы столкнулись.переживает.Пожалуйста, ответьте, чтобы сообщить нам, нужна ли вам дополнительная информация.Спасибо.