Процесс наблюдателя файловой системы вызван из другого класса, не вызывая события c # - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть служба Windows, которая в основном контролирует папку, копирует файлы в локальный каталог и обрабатывает файлы.Служба запускается достаточно хорошо, вызывает класс Watcher и выполняет всю конфигурацию так, как должна.Так что мой код работает для настройки.Однако я получаю 0 событий.Мне интересно, если мой метод StartFolderWatcher() выходит из области видимости, мой объект каким-либо образом удаляется, даже если он объявлен на уровне класса.

Так нужно ли непрерывно запускать объект в отдельном потоке?Если да, могу ли я получить пример того, как я должен это сделать Task.Run(()=> myObject)

Соответствующий код приведен ниже - если требуется больше, просто спросите, и я опубликую его.

        static class Program
        {
            static void Main(string[] args)
            {
                JobProcessor service = new JobProcessor();

                if (Environment.UserInteractive)
                {                 
                    service.RunAsConsole(args);
                }
           }

            private static bool IsDebugMode(string[] args)
            {
                if (args == null) return false;
                if (args[0].ToLower() == "/debug") return true;
                return false;
            }

    }

        public partial class JobProcessor : ServiceBase
        {
            string[] folders = new string[] {"InBoxFolder"};

            HotFolderWatch HFW = new HotFolderWatch();

            public JobProcessor()
            {
                InitializeComponent();

            }

            protected override void OnStart(string[] args)
            {

                StartFolderWatcher();
            }

            public void StartFolderWatcher()
            {
                FileWatcherInfo[] ServiceWatchers = new FileWatcherInfo[4];

                ServiceConfiguration sc = new ServiceConfiguration();

                for (int i = 0; i < folders.Length; i++)
                {
                    ServiceWatchers[i] = sc.GetWatchFolderSettings(folders[i]);
                }

                HFW = new HotFolderWatch(ServiceWatchers[0]);

                HFW.ReadyToProcess += ReadyToProcess;
                HFW.InBoxFolderDisconnected += OnInBoxFolderDisconnected;
                HFW.LocalFolderDisconnected += OnLocalFolderDisconnected;
                HFW.ProcessFolderDisconnected += OnProcessFolderDisconnected;

            }


            public void RunAsConsole(string[] args)
            {
              OnStart(args);
              Console.WriteLine("Press any key to exit...");
              Console.ReadLine();
              OnStop();
            }

         }


            public HotFolderWatch(FileWatcherInfo inbox)
            {


                this.InboxCacheTimeMilliseconds = inbox.CacheTimeMilliseconds;
                this.InBoxFolder = inbox.Folder.Trim();
                this.InboxFileFilter = inbox.Filter.Trim();
            SetInboxWatcher();

           }

            private void SetInboxWatcher()
            {
                InBoxWatcher = new FileSystemWatcher(InBoxFolder, InboxFileFilter);
                InBoxWatcher.IncludeSubdirectories = false;
                InBoxWatcher.NotifyFilter =
 NotifyFilters.LastAccess | NotifyFilters.LastWrite;

                InboxCache = MemoryCache.Default;
                InboxCachePolicy = new CacheItemPolicy()
                {
                    RemovedCallback = OnRemovedFromInBoxCache
                };

                InBoxWatcher.Created += new FileSystemEventHandler(OnInBoxChanged);
                InBoxWatcher.EnableRaisingEvents = true;
            }

            private void OnInBoxChanged(object source, FileSystemEventArgs e)
            {
                InboxCachePolicy.AbsoluteExpiration =

 DateTimeOffset.Now.AddMilliseconds(InboxCacheTimeMilliseconds);
                InboxCache.AddOrGetExisting(e.Name, e, InboxCachePolicy);
            }    
    }

Если вМой класс HotFolderWatch Я создаю FileSystemWatcher в методе, как показано ниже, код работает!

private void CreateWatcher()
{

    FileSystemWatcher fsw = new FileSystemWatcher(@"C:\Tests\JobQueue\InFolder","*.txt");
    fsw.Created += Fsw_Created;
    fsw.EnableRaisingEvents = true;
}

private void Fsw_Created(object sender, FileSystemEventArgs e)
{
    string ex = e.FullPath;
    WatcherChangeTypes ctmp = e.ChangeType;
   // throw new NotImplementedException();
}

1 Ответ

0 голосов
/ 27 сентября 2018

Оказывается, конструктор по умолчанию FileSystemWatcher использует фильтр FileName по умолчанию, и я думал, что получу последнюю запись или последний доступ без меня, связанного с именем.Отсюда я получил хорошую информацию: https://www.codeproject.com/Articles/1220094/NotifyFilters-Enumeration-Explained-FileSystemWatc

Статья, размещенная в ссылке, помогла мне решить мою проблему.

Мне нужно было Ste NotifyFilters.FileName как одинфильтров.

...