С точки зрения загрузки сервера, использование IO.FileSystemWatcher для удаленных уведомлений об изменениях в описываемом вами сценарии, вероятно, является наиболее эффективным из возможных методов. Он использует FindFirstChangeNotification и ReadDirectoryChangesW Win32 API-функции для внутреннего использования, которые, в свою очередь, обмениваются данными с сетевым перенаправителем оптимизированным способом (при условии использования стандартных сетей Windows: если используется сторонний перенаправитель, и он не поддерживает необходимую функциональность, все не будет работать вообще). Оболочка .NET также использует асинхронный ввод-вывод и все остальное, еще больше обеспечивая максимальную эффективность.
Единственная проблема этого решения в том, что оно не очень надежно. Помимо необходимости иметь дело с временным разрывом сетевых подключений (что не является большой проблемой, поскольку IO.FileSystemWatcher будет инициировать событие ошибки в этом случае, которое вы можете обработать), базовый механизм имеет определенные фундаментальные ограничения. Из документации MSDN для функций Win32 API:
ReadDirectoryChangesW завершается ошибкой с ERROR_INVALID_PARAMETER, когда длина буфера превышает 64 КБ, и приложение отслеживает каталог по сети. Это связано с ограничением размера пакета базовыми протоколами обмена файлами
Уведомления не могут быть возвращены при вызове FindFirstChangeNotification для удаленной файловой системы
Другими словами: при высокой нагрузке (когда вам потребуется большой буфер) или, что еще хуже, при случайных неуказанных обстоятельствах вы можете не получить ожидаемых уведомлений. Это даже проблема с локальными наблюдателями файловой системы, но это гораздо больше проблем по сети. Другой вопрос здесь, касающийся SO , более подробно описывает присущие API проблемы с надежностью.
При использовании наблюдателей файловой системы ваше приложение должно справляться с этими ограничениями. Например:
Если файлы, которые вы ищете, имеют порядковые номера, сохраните последний порядковый номер, о котором вы получили уведомление, чтобы вы могли искать «пробелы» в будущих уведомлениях и обрабатывать файлы, для которых вы не получили извещен;
При получении уведомления всегда выполняйте полное сканирование каталога. Это может звучать очень плохо, но поскольку сканирование выполняется по событиям, оно все же намного эффективнее, чем простой опрос. Кроме того, до тех пор, пока вы храните общее количество файлов в одном каталоге, а также количество сканируемых каталогов, менее тысячи или около того, влияние этой операции на производительность должно быть в любом случае довольно минимальным.
Настройка нескольких слушателей - это то, чего вам следует избегать, насколько это возможно: во всяком случае, это сделает вещи даже менее надежными ...
В любом случае, если у вас есть для использования наблюдателей файловой системы, все может работать нормально, если вы знаете об ограничениях и не ожидаете уведомления 1: 1 для каждого измененного файла / создано.
Итак, если у вас есть другие варианты (по сути, если процесс записи файлов уведомляет вас не на основе файловой системы: любой обычный метод RPC будет улучшением ...), то это определенно стоит рассмотреть точка зрения надежности.