.Net FileWatcher не работает для ~ 80 + файлов

Я использую файл .net 2.0 filewatcher для просмотра папки для новых файлов. Он отлично работает, за исключением случаев, когда я помещал более ~ 80 файлов одновременно. Событие просто больше не срабатывает. Это как будто файловый менеджер настроен на отслеживание определенного количества файлов.

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

Здесь код, который я использую для события. Это довольно стандартный материал, который ничего не представляет.


FileWatcher = new FileSystemWatcher();
FileWatcher.Path = ConfigurationManager.AppSettings["FolderOfFilesToWatch"];
FileWatcher.NotifyFilter = NotifyFilters.FileName;
FileWatcher.Filter = "*_*_*.*";
FileWatcher.Created += new FileSystemEventHandler(watcher_Created);
FileWatcher.EnableRaisingEvents = true;


static void watcher_Created(object sender, FileSystemEventArgs e)
{
Console.Write(e.Name);
}

Любые идеи?

Ответы

Ответ 1

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

Попробуйте установить больший размер буфера, чтобы это не происходило.

Ответ 2

Я использую FileWatcher, но я взял подход "пояс и подтяжки". Всякий раз, когда я получаю событие FileWatcher, я придерживаюсь и проверяю файлы, которые я раньше не видел (в моем случае у меня есть каталог файлов). Поверьте мне, будет время, когда вы получите тысячи файлов, упавших в папку, и у вас должна быть еще одна защита для их учета.

Еще одна альтернатива, которую вы можете изучить, - изменить журналы, хотя она (AFAIK) ограничена дисками, прикрепленными к вашей машине, тогда как вы можете используйте FileWatcher для просмотра путей UNC.

Ответ 3

Возможно, вы превысите количество просмотров вашей системы ThreadPool. Когда FileSystemWatcher запускает событие, он делает это из потока, извлеченного из этого пула. Возможно, эти события проиграют, если у вас недостаточно потоков, выделенных для ThreadPool.

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

Как и другие, особенно, "ocdecio" отметили, что хорошо не полностью доверять FileSystemWatcher. Это, как известно, несовместимо при большой нагрузке.

Ответ 4

считают, что это или нет. У акций CIFS есть свои собственные настройки, на которые вы должны обратить внимание. 50, по-видимому, является значением по умолчанию для большинства кол-ва файлов share count (я не знаю достаточно об этом, чтобы знать что-то другое, кроме термина... извините)

В любом случае - эта проблема немного нас преследовала - и, к счастью, наш поставщик хранилищ был достаточно любезен, чтобы понять нас в этой проблеме.

Взгляните сюда и посмотрите, не поможет ли вам преодолеть магию 50...

http://support.microsoft.com/kb/810886