.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