#c# #.net #.net-core
Вопрос:
Я пытаюсь реализовать фоновую службу в веб-api .Net Core. Эта фоновая служба создает наблюдатель файловой системы, который должен отслеживать изменения файлов в определенной папке и реагировать соответствующим образом. Проблема в том, что он никогда не реагирует, вот код.
У меня есть сотрудник, отвечающий за эту логику.
public FileSystemWatcher CreateFileWatcher(string path) { // Create a new FileSystemWatcher and set its properties. FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = path; /* Watch for changes in LastAccess and LastWrite times, and the renaming of files or directories. */ watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; // Only watch text files. watcher.Filter = "*.txt"; // Add event handlers. watcher.Changed = new FileSystemEventHandler(OnChanged); watcher.Created = new FileSystemEventHandler(OnCreated); watcher.Deleted = new FileSystemEventHandler(OnChanged); //watcher.Renamed = new RenamedEventHandler(OnRenamed); // Begin watching. watcher.EnableRaisingEvents = true; return watcher; } public async Task DoWork(CancellationToken cancellationToken) { var watcher = CreateFileWatcher(_config.GetSection("filesRoute").Value); }
И этот работник вызывается из моего фонового сервиса, вот так
public class HiladoresBackgroundProcess : BackgroundService { private readonly IConfiguration _configuration; private readonly IWorker _worker; public HiladoresBackgroundProcess(IConfiguration config, IWorker worker) { _configuration = config; _worker = worker; } protected override Task ExecuteAsync(CancellationToken stoppingToken) { _worker.DoWork(stoppingToken); return Task.CompletedTask; } }
Я знаю, что файлообменник создается при запуске, но события не запускаются.
Комментарии:
1. Хм, эти события поддерживают жизнь наблюдателя? Если нет, то вам прекрасно удается никогда не удерживать его в переменной. обе переменные в конечном итоге становятся локальными — и выходят за рамки области действия в тот момент, когда методы исчезают. Попробуйте сделать 2-ю статическую переменную уровня класса — по крайней мере, то, что вы можете посмотреть в отладчике.
2. Вы убедились, что процесс размещения имеет права доступа к указанному пути?
3. Конечно, это не вызывает никаких событий. Он создается, а затем немедленно выходит за рамки. Другими словами: Он исчез.
4. Дело не в том, где он работает, а в том, когда (и как часто). Он будет вызван один раз . Если вы хотите или вам нужно, чтобы он продолжал работать, вам нужно вставить туда какой-то цикл.
5. @альвардо В данный момент ASP.NET Ядро запустит ваш код, который будет выполнен ровно один раз, а затем вернется — ваш работник «мертв» после этого, обработчикам вроде
OnChanged
не на чем работать.