从另一个 class 调用的文件系统观察程序进程未触发事件 c#

File System Watcher Process called from another class not firing events c#

我有一项 windows 服务,主要用于监视文件夹、将文件复制到本地目录并处理文件。该服务启动得很好,可以调用 Watcher Class 并按照应有的方式进行所有配置。所以我的代码适用于设置。但是我触发了 0 个事件。我想知道当我的 StartFolderWatcher() 方法超出范围时,我的对象 - 即使在 class 级别声明也会以某种方式被处置。

那么我是否需要 运行 在单独的线程中连续地处理对象?如果可以的话,我能举个例子说明我应该怎么做 Task.Run(()=> myObject)

相关代码如下 - 如果需要更多,请询问,我会 post。

        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 Class 中,我在下面的代码中创建了一个 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();
}

事实证明,FileSystemWatcher 的默认构造函数默认使用过滤器 FileName,我想我将获得最后一次写入或最后一次访问,而不用担心名称。 我从这里收到了很好的信息: https://www.codeproject.com/Articles/1220094/NotifyFilters-Enumeration-Explained-FileSystemWatc

link 中发布的文章帮助我解决了问题。

我不得不将 NotifyFilters.FileName 作为过滤器之一。