C# filesystemwatcher прекращает запуск событий через некоторое время
Я хочу отслеживать изменения файлов определенного пути, и я в значительной степени закончил с кодом, который теперь работает нормально.это отслеживание создания файлов , переименованных и измененных .
Моя проблема заключается в том ,что когда я запускаю Filesystemwatcher, он работает нормально, но через некоторое время перестает работать, то есть перестает запускать создание, удаление и изменение события.
Кто-нибудь может мне помочь?
Заранее спасибо.
Вот мой код lstFolder это мой список множественных путей
я использую оконное приложение для просмотра файлов и использую службу окон для запуска этого оконного приложения.
this.listFileSystemWatcher = new List(); // Loop the list to process each of the folder specifications found if (lstFolder.Count > 0)// check if path is available to watch else exit file watcher { foreach (CustomFolderSettings customFolder in lstFolder) { DirectoryInfo dir = new DirectoryInfo(customFolder.FWPath); // Checks whether the folder is enabled and // also the directory is a valid location if (dir.Exists)//customFolder.FolderEnabled && { customFolder.AllowedFiles = customFolder.FWExtension;// setting extension to allowed filw extension to log . foreach (var strExt in customFolder.FWExtension.Split(',')) { // Creates a new instance of FileSystemWatcher //FileSystemWatcher fileSWatch = new FileSystemWatcher(); this.fileSWatch = new FileSystemWatcher(); // Sets the filter fileSWatch.Filter = strExt;// customFolder.FolderFilter; // Sets the folder location fileSWatch.Path = customFolder.FWPath; fileSWatch.InternalBufferSize = 64000; // Sets the action to be executed StringBuilder actionToExecute = new StringBuilder(customFolder.ExecutableFile); // List of arguments StringBuilder actionArguments = new StringBuilder(customFolder.ExecutableArguments); // Subscribe to notify filters fileSWatch.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; // Associate the events that will be triggered when a new file Created,Changed,Deleted,Renamed // // is added to the monitored folder, using a lambda expression fileSWatch.Created += (senderObj, fileSysArgs) => fileSWatch_Created(senderObj, fileSysArgs, actionToExecute.ToString(), customFolder.AllowedFiles); fileSWatch.Changed += (senderObj, fileSysArgs) => fileSWatch_Changed(senderObj, fileSysArgs, actionToExecute.ToString(), customFolder.AllowedFiles); fileSWatch.Deleted += (senderObj, fileSysArgs) => fileSWatch_Deleted(senderObj, fileSysArgs, actionToExecute.ToString(), customFolder.AllowedFiles); fileSWatch.Renamed += (senderObj, fileSysArgs) => fileSWatch_Renamed(senderObj, fileSysArgs, actionToExecute.ToString(), customFolder.AllowedFiles); fileSWatch.Error += (senderObj, fileSysArgs) => fileSWatch_Error(senderObj, fileSysArgs, actionToExecute.ToString(), customFolder.AllowedFiles); // will track changes in sub-folders as well fileSWatch.IncludeSubdirectories = customFolder.FWSubFolders; // Begin watching fileSWatch.EnableRaisingEvents = true; // Add the systemWatcher to the list listFileSystemWatcher.Add(fileSWatch); GC.KeepAlive(fileSWatch); GC.KeepAlive(listFileSystemWatcher); } } } } else { Application.Exit(); }
Что я уже пробовал:
пробовал использовать внутреннее буферное хранилище и GC.keepalive (), но проблемы остались прежними.
0x01AA
Из того, что я читал о GC.KeepAlive
- это очень хитрая штука. GC.KeepAlive не запрещает GC удалять объект "навсегда".
Посмотрите, например, здесь:
Когда GC.KeepAlive этого не делает – блог Криса Лайона[^]
Я бы просто позаботился о том, чтобы сфера вашего listFileSystemWatcher
припадки.
Gerry Schmitz
Сколько "наблюдателей" файлов вы создаете?
Вы следили за их потреблением памяти с течением времени?
Сколько наблюдателей за файлами-это "слишком много"?
О скольких "событиях" идет речь?
Вы когда-нибудь "избавлялись" от наблюдателя файлов?
Вы когда-нибудь "перезапускали" файловый наблюдатель?
Dirk Bahle
На днях я прочитал статью Бена и подумал, что его модель довольно интересна, поскольку я столкнулся с подобными проблемами. У меня не было времени попробовать это на себе но может быть здесь есть что то полезное:
https://www.codeproject.com/Articles/1220093/A-Robust-Solution-for-FileSystemWatcher-Firing-Eve