Фоновая служба .net Core

#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 не на чем работать.